From e19eb3d8286ad66f455721f8b7f8260bce5e4016 Mon Sep 17 00:00:00 2001 From: John Crispin Date: Sat, 2 Jun 2007 00:46:02 +0000 Subject: add initial support for the crisarchitecture used on foxboards to openwrt SVN-Revision: 7439 --- .../etrax-2.6/image/e100boot/src/sbl/Makefile | 77 + .../etrax-2.6/image/e100boot/src/sbl/Makefile.in | 76 + .../etrax-2.6/image/e100boot/src/sbl/boot_images.c | 35 + .../etrax-2.6/image/e100boot/src/sbl/boot_images.h | 20 + .../linux/etrax-2.6/image/e100boot/src/sbl/cconv | 158 ++ .../etrax-2.6/image/e100boot/src/sbl/common.c | 1677 ++++++++++++++++++++ .../etrax-2.6/image/e100boot/src/sbl/common.h | 57 + .../linux/etrax-2.6/image/e100boot/src/sbl/conf.h | 139 ++ .../etrax-2.6/image/e100boot/src/sbl/conf.h.in | 138 ++ .../etrax-2.6/image/e100boot/src/sbl/config.cache | 48 + .../etrax-2.6/image/e100boot/src/sbl/config.log | 90 ++ .../etrax-2.6/image/e100boot/src/sbl/config.status | 330 ++++ .../etrax-2.6/image/e100boot/src/sbl/configure | 1405 ++++++++++++++++ .../etrax-2.6/image/e100boot/src/sbl/configure.in | 19 + .../image/e100boot/src/sbl/create_regs.pl | 14 + .../etrax-2.6/image/e100boot/src/sbl/deps/common.d | 58 + .../image/e100boot/src/sbl/deps/network.d | 56 + .../etrax-2.6/image/e100boot/src/sbl/deps/serial.d | 56 + .../etrax-2.6/image/e100boot/src/sbl/net_ima.c | 891 +++++++++++ .../image/e100boot/src/sbl/net_noleds_ima.c | 873 ++++++++++ .../etrax-2.6/image/e100boot/src/sbl/network.c | 706 ++++++++ .../etrax-2.6/image/e100boot/src/sbl/network.h | 42 + .../etrax-2.6/image/e100boot/src/sbl/reg_des.h | 141 ++ .../etrax-2.6/image/e100boot/src/sbl/ser_ima.c | 825 ++++++++++ .../image/e100boot/src/sbl/ser_noleds_ima.c | 807 ++++++++++ .../etrax-2.6/image/e100boot/src/sbl/serial.c | 637 ++++++++ .../etrax-2.6/image/e100boot/src/sbl/serial.h | 26 + .../image/e100boot/src/sbl/win32/Makefile | 8 + .../image/e100boot/src/sbl/win32/boot_images.c | 35 + .../image/e100boot/src/sbl/win32/common.c | 1651 +++++++++++++++++++ .../image/e100boot/src/sbl/win32/network.c | 681 ++++++++ 31 files changed, 11776 insertions(+) create mode 100644 target/linux/etrax-2.6/image/e100boot/src/sbl/Makefile create mode 100644 target/linux/etrax-2.6/image/e100boot/src/sbl/Makefile.in create mode 100644 target/linux/etrax-2.6/image/e100boot/src/sbl/boot_images.c create mode 100644 target/linux/etrax-2.6/image/e100boot/src/sbl/boot_images.h create mode 100755 target/linux/etrax-2.6/image/e100boot/src/sbl/cconv create mode 100644 target/linux/etrax-2.6/image/e100boot/src/sbl/common.c create mode 100644 target/linux/etrax-2.6/image/e100boot/src/sbl/common.h create mode 100644 target/linux/etrax-2.6/image/e100boot/src/sbl/conf.h create mode 100644 target/linux/etrax-2.6/image/e100boot/src/sbl/conf.h.in create mode 100644 target/linux/etrax-2.6/image/e100boot/src/sbl/config.cache create mode 100644 target/linux/etrax-2.6/image/e100boot/src/sbl/config.log create mode 100755 target/linux/etrax-2.6/image/e100boot/src/sbl/config.status create mode 100755 target/linux/etrax-2.6/image/e100boot/src/sbl/configure create mode 100644 target/linux/etrax-2.6/image/e100boot/src/sbl/configure.in create mode 100755 target/linux/etrax-2.6/image/e100boot/src/sbl/create_regs.pl create mode 100644 target/linux/etrax-2.6/image/e100boot/src/sbl/deps/common.d create mode 100644 target/linux/etrax-2.6/image/e100boot/src/sbl/deps/network.d create mode 100644 target/linux/etrax-2.6/image/e100boot/src/sbl/deps/serial.d create mode 100644 target/linux/etrax-2.6/image/e100boot/src/sbl/net_ima.c create mode 100644 target/linux/etrax-2.6/image/e100boot/src/sbl/net_noleds_ima.c create mode 100644 target/linux/etrax-2.6/image/e100boot/src/sbl/network.c create mode 100644 target/linux/etrax-2.6/image/e100boot/src/sbl/network.h create mode 100644 target/linux/etrax-2.6/image/e100boot/src/sbl/reg_des.h create mode 100644 target/linux/etrax-2.6/image/e100boot/src/sbl/ser_ima.c create mode 100644 target/linux/etrax-2.6/image/e100boot/src/sbl/ser_noleds_ima.c create mode 100644 target/linux/etrax-2.6/image/e100boot/src/sbl/serial.c create mode 100644 target/linux/etrax-2.6/image/e100boot/src/sbl/serial.h create mode 100644 target/linux/etrax-2.6/image/e100boot/src/sbl/win32/Makefile create mode 100755 target/linux/etrax-2.6/image/e100boot/src/sbl/win32/boot_images.c create mode 100644 target/linux/etrax-2.6/image/e100boot/src/sbl/win32/common.c create mode 100755 target/linux/etrax-2.6/image/e100boot/src/sbl/win32/network.c (limited to 'target/linux/etrax-2.6/image/e100boot/src/sbl') diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/Makefile b/target/linux/etrax-2.6/image/e100boot/src/sbl/Makefile new file mode 100644 index 0000000000..ffb6e9fb13 --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/Makefile @@ -0,0 +1,77 @@ +# Generated automatically from Makefile.in by configure. +# +# Makefile for e100boot, sbl side. +# +# $Id: Makefile.in,v 1.21 2003/11/21 11:38:30 pkj Exp $ +# + +VPATH := .:../cbl + +CC = gcc + +AXIS_USABLE_LIBS = UCLIBC GLIBC +-include $(AXIS_TOP_DIR)/tools/build/Rules.axis + +CFLAGS += -I. -I../cbl/src -g -O2 -I../libpcap-0.4/ -I../libpcap-0.4/bpf/ -Wall -Wmissing-prototypes -Wno-unused +LDFLAGS = +LDLIBS = -L../libpcap-0.4/ +LDLIBS = +LIBPCAP = ../libpcap-0.4/libpcap.a + +IMAGES := ../cbl/net/net.ima ../cbl/net_noleds/net_noleds.ima \ + ../cbl/ser/ser.ima ../cbl/ser_noleds/ser_noleds.ima + +AUTOSRCS := $(addsuffix .c, $(subst .ima,_ima,$(notdir $(IMAGES)))) + +OBJS := common.o network.o serial.o +DEPS := $(addprefix deps/, $(subst .o,.d,$(OBJS))) + +STRIP ?= strip + +all: conf.h e100boot e100boot.stripped + +depend: $(DEPS) + +Makefile: Makefile.in + @echo -e "\n### New Makefile.in detected, regenerating Makefile..." + ./configure + +e100boot: common.o boot_images.o serial.o network.o $(LIBPCAP) + @echo -e '\n### Finally... Compiling e100boot.' + $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@ + +e100boot.stripped: e100boot + cp $< $@ + $(STRIP) --strip-unneeded $@ + +boot_images.o: boot_images.c boot_images.h $(AUTOSRCS) + $(CC) -c $(CFLAGS) $< -o $@ + +conf.h: + ./configure + +reconf: + ./configure --cache=/dev/null + +clean: + rm -rf e100boot Makefile conf.h config.log config.cache config.status deps *.ima *.o *_ima.c* *~ + +$(IMAGES): + @echo -e '\n### Making cbl boot images (*.ima)...' + $(MAKE) -C ../cbl + +ifneq ($(MAKECMDGOALS),clean) +-include $(DEPS) +endif + +deps/%.d: %.c + @[ -d deps ] || mkdir deps + $(CC) -M $(CFLAGS) $< > $@ + +deps/%.d: %.S + @[ -d deps ] || mkdir deps + $(CC) -M $(CFLAGS) $< > $@ + +%_ima.c: %.ima + @echo -e "### Creating $@ from image $<" + @./cconv $*_ima < $< > $@ diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/Makefile.in b/target/linux/etrax-2.6/image/e100boot/src/sbl/Makefile.in new file mode 100644 index 0000000000..bdefd71514 --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/Makefile.in @@ -0,0 +1,76 @@ +# +# Makefile for e100boot, sbl side. +# +# $Id: Makefile.in,v 1.21 2003/11/21 11:38:30 pkj Exp $ +# + +VPATH := .:../cbl + +CC = @CC@ + +AXIS_USABLE_LIBS = UCLIBC GLIBC +-include $(AXIS_TOP_DIR)/tools/build/Rules.axis + +CFLAGS += -I. -I../cbl/src @CFLAGS@ -I../libpcap-0.4/ -I../libpcap-0.4/bpf/ -Wall -Wmissing-prototypes -Wno-unused +LDFLAGS = +LDLIBS = -L../libpcap-0.4/ @LIBS@ +LDLIBS = +LIBPCAP = ../libpcap-0.4/libpcap.a + +IMAGES := ../cbl/net/net.ima ../cbl/net_noleds/net_noleds.ima \ + ../cbl/ser/ser.ima ../cbl/ser_noleds/ser_noleds.ima + +AUTOSRCS := $(addsuffix .c, $(subst .ima,_ima,$(notdir $(IMAGES)))) + +OBJS := common.o network.o serial.o +DEPS := $(addprefix deps/, $(subst .o,.d,$(OBJS))) + +STRIP ?= strip + +all: conf.h e100boot e100boot.stripped + +depend: $(DEPS) + +Makefile: Makefile.in + @echo -e "\n### New Makefile.in detected, regenerating Makefile..." + ./configure + +e100boot: common.o boot_images.o serial.o network.o $(LIBPCAP) + @echo -e '\n### Finally... Compiling e100boot.' + $(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@ + +e100boot.stripped: e100boot + cp $< $@ + $(STRIP) --strip-unneeded $@ + +boot_images.o: boot_images.c boot_images.h $(AUTOSRCS) + $(CC) -c $(CFLAGS) $< -o $@ + +conf.h: + ./configure + +reconf: + ./configure --cache=/dev/null + +clean: + rm -rf e100boot Makefile conf.h config.log config.cache config.status deps *.ima *.o *_ima.c* *~ + +$(IMAGES): + @echo -e '\n### Making cbl boot images (*.ima)...' + $(MAKE) -C ../cbl + +ifneq ($(MAKECMDGOALS),clean) +-include $(DEPS) +endif + +deps/%.d: %.c + @[ -d deps ] || mkdir deps + $(CC) -M $(CFLAGS) $< > $@ + +deps/%.d: %.S + @[ -d deps ] || mkdir deps + $(CC) -M $(CFLAGS) $< > $@ + +%_ima.c: %.ima + @echo -e "### Creating $@ from image $<" + @./cconv $*_ima < $< > $@ diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/boot_images.c b/target/linux/etrax-2.6/image/e100boot/src/sbl/boot_images.c new file mode 100644 index 0000000000..3aabdf06d7 --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/boot_images.c @@ -0,0 +1,35 @@ +/* boot_images.c - Collection of the different boot images + * Johan Adolfsson Axis Communications AB + * $Id: boot_images.c,v 1.2 2002/07/01 14:37:51 pkj Exp $ + */ + +#include +#include "boot_images.h" + +/* We include the C files here to the size etc. easy */ +#include "net_ima.c" +#include "ser_ima.c" +#include "net_noleds_ima.c" +#include "ser_noleds_ima.c" + +struct boot_image_info_type boot_image_info[] = +{ + { INTERNAL_NW, net_ima, sizeof net_ima, "Network boot (default)"}, + { INTERNAL_SER, ser_ima, sizeof ser_ima, "Serial boot"}, + { INTERNAL_SER_NOLEDS, ser_noleds_ima, sizeof ser_noleds_ima, "Serial boot, no leds"}, + { INTERNAL_NW_NOLEDS, net_noleds_ima, sizeof net_noleds_ima, "Network boot, no leds"}, + + { "DBGNONE", net_ima, sizeof net_ima, "Obsolete (use INTERNAL_NW instead)" }, + { "DBG0", net_ima, sizeof net_ima, "Obsolete (use INTERNAL_NW instead)" }, + { "DBG1", net_ima, sizeof net_ima, "Obsolete (use INTERNAL_NW instead)" }, + { "DBG2", net_ima, sizeof net_ima, "Obsolete (use INTERNAL_NW instead)" }, + { "DBG3", net_ima, sizeof net_ima, "Obsolete (use INTERNAL_NW instead)" }, + + { "DBGNONE_NOLEDS", net_noleds_ima, sizeof net_noleds_ima, "Obsolete (use INTERNAL_NW_NOLEDS instead)" }, + { "DBG0_NOLEDS", net_noleds_ima, sizeof net_noleds_ima, "Obsolete (use INTERNAL_NW_NOLEDS instead)" }, + { "DBG1_NOLEDS", net_noleds_ima, sizeof net_noleds_ima, "Obsolete (use INTERNAL_NW_NOLEDS instead)" }, + { "DBG2_NOLEDS", net_noleds_ima, sizeof net_noleds_ima, "Obsolete (use INTERNAL_NW_NOLEDS instead)" }, + { "DBG3_NOLEDS", net_noleds_ima, sizeof net_noleds_ima, "Obsolete (use INTERNAL_NW_NOLEDS instead)" }, + + { NULL, NULL, 0, NULL } /* End of array */ +}; diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/boot_images.h b/target/linux/etrax-2.6/image/e100boot/src/sbl/boot_images.h new file mode 100644 index 0000000000..cd7a1ae48d --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/boot_images.h @@ -0,0 +1,20 @@ +/* boot_images.h - Collection of the different boot images + * Johan Adolfsson Axis Communications AB + * $Id: boot_images.h,v 1.2 2002/07/01 14:37:51 pkj Exp $ + */ + +#define INTERNAL_SER "INTERNAL_SER" +#define INTERNAL_NW "INTERNAL_NW" +#define INTERNAL_NW_NOLEDS "INTERNAL_NW_NOLEDS" +#define INTERNAL_SER_NOLEDS "INTERNAL_SER_NOLEDS" + +typedef struct boot_image_info_type +{ + const char *name; + const char *ptr; + unsigned long len; + const char *info; +} boot_image_info_type; + +extern struct boot_image_info_type boot_image_info[]; + diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/cconv b/target/linux/etrax-2.6/image/e100boot/src/sbl/cconv new file mode 100755 index 0000000000..ce5ab3d705 --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/cconv @@ -0,0 +1,158 @@ +#!/usr/bin/perl +#! +#! FILE NAME : cconv +#! +#! PARAMETERS : Name of C program array variable. +#! +#! DESCRIPTION: Converts bytes of a binary file to C source code containing +#! char array initialized with the binary file data. +#! +#! SUBROUTINES: +#! +#!--------------------------------------------------------------------------- +#! HISTORY +#! +#! DATE NAME CHANGES +#! ---- ---- ------- +#! Dec 15 1997 Sven Ekstrom Initial version. Rewritten to Perl from C. +#! Dec 16 1997 Sven Ekstrom Fixed bug that generated truncated result. +#! +#!--------------------------------------------------------------------------- +#! +#! (C) Copyright 1997, Axis Communications AB, LUND, SWEDEN +#! +#!*************************************************************************** +# @(#) cconv 1.2 12/16/97 + +#********************** CONSTANT SECTION ************************************ + +$MyName = 'cconv'; + +# +# Number of bytes per line in the result. +# +$LineLength = 8; + +#********************** MAIN PROGRAM SECTION ******************************** + +# +# Make sure the command line contains the name of a C array. +# +if (scalar @ARGV != 1 || $ARGV[0] =~ /^-/) +{ + die "$MyName: Usage:\n", + "\n", + " Syntax\n", + " $MyName \n", + "\n", + " : This is the name of the char array where\n", + " the result is placed.\n", + "\n", + " Description\n", + "\n", + " Reads input from STDIN as binary data. Each byte of input data is\n", + " converted to C char data in hexadecimal form. The whole file read\n", + " from STDIN is converted and the result, C source code definition of\n", + " a char array, is printed on STDOUT.\n", + "\n"; +} + +# +# Start with the name and version of this program and the name of the array. +# +print "\n", + "/* $MyName 1.2 12/16/97, Copyright (C) 1997, Axis Communications AB */\n", + "\n", + "const char $ARGV[0]\[\] =\n", + "{"; + +# +# Read all bytes from STDIN, convert them to char data and print them on +# STDOUT. +# +$CurrentOffset = 0; +while (!eof(STDIN)) +{ + $Byte = ord(getc); + + if ($CurrentOffset % $LineLength == 0) + { + # + # Start of a new line. + # + if ($CurrentOffset != 0) + { + # + # This is not the first byte. + # + print ","; + } + # + # The new line is indented by 2 spaces. + # + print "\n", + " "; + } + else + { + # + # Continuing an old line. + # + print ", "; + } + + # + # Print the value of the byte as hex char data. + # + printf("'\\x%02x'", $Byte); + + $CurrentOffset++; +} + +if ($CurrentOffset == 0) +{ + # + # Initialize the array with a single byte of zero. + # + print "\n '\\x00'"; +} + +# +# End with the closing bracket and semicolon. +# +print "\n", + "};\n"; + +exit 0; + + +#********************** SUBROUTINE DEFINITION SECTION *********************** + +#**************************************************************************** +#* +#* SUBROUTINE : +#* +#* PARAMETERS : +#* +#* RETURNS : +#* +#* SIDE EFFECTS: +#* +#* DESCRIPTION : +#* +#*--------------------------------------------------------------------------- +#* HISTORY +#* +#* DATE NAME CHANGES +#* ---- ---- ------- +#* May 05, 1995 Sven Ekstrom Initial version +#* +#**************************************************************************** + +#sub NN +#{ +# local() = @_; +# +#} + +#************************ END OF FILE cconv ********************************* diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/common.c b/target/linux/etrax-2.6/image/e100boot/src/sbl/common.c new file mode 100644 index 0000000000..e0fe6ce29e --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/common.c @@ -0,0 +1,1677 @@ +/*!*************************************************************************** +*! +*! FILE NAME : common.c +*! +*! DESCRIPTION: Common functions for e100boot. +*! +*! --------------------------------------------------------------------------- +*! HISTORY +*! +*! DATE NAME CHANGES +*! ---- ---- ------- +*! ??? ? ???? Ronny Ranerup Initial version +*! --------------------------------------------------------------------------- +*! (C) Copyright 1999-2006 Axis Communications AB, LUND, SWEDEN +*!***************************************************************************/ +/* $Id: common.c,v 1.13 2006/02/08 14:00:25 pkj Exp $ */ + +/************************** Version **************************************/ + +char version[] = "Time-stamp: $Id: common.c,v 1.13 2006/02/08 14:00:25 pkj Exp $"; + +/************************** Include files ********************************/ + +#include + +#include +#include +#include +#include "boot_images.h" +#include +#include +#include + +#include +#include + +/************************** Constants and macros *************************/ + +#define BOOT_CMDS_FILE "BOOT_CMDS" + +/************************** Type definitions *****************************/ + +struct label_t { + struct label_t *prev; + udword addr; + char *name; +}; + +/************************** Global variables *****************************/ + +char needle[MAX_STRING_LEN] = "END"; /* search needle for --find */ +int needle_len = 3; + +int exitonfind = FALSE; + +int doing_flash = FALSE; /* Just a flag to see if we should + warn that it might take some + time. */ + +int toFiles = FALSE; /* Dump all packets to files. */ +int cmdsOnly = FALSE; /* Just dump boot cmds to file. */ +int netBoot = TRUE; /* Do network boot? */ +int serBoot = FALSE; /* Do serial boot? */ + +struct label_t *loop_label = NULL; +struct label_t *label = NULL; + +struct packet_buf *first_packet = NULL; +struct packet_buf *last_packet = NULL; + +struct packet_buf *boot_cmds_packet; + +int create_boot_loader = TRUE; + +/* We use the INTERNAL boot image as default */ +char boot_loader_file[MAX_STRING_LEN] = INTERNAL_NW; + +int noleds = FALSE; /* Use boot images that doesn't toggle leds? */ + +struct boot_files_T *first_boot_file = NULL; +struct boot_files_T *last_boot_file = NULL; + +unsigned int boot_cmds[SIZE_OF_BOOT_CMDS / sizeof(unsigned int)]; +int boot_cmds_cnt = 0; + +int svboot = FALSE; + +int quiet = 0; + +struct packet_header_T send_packet; +struct packet_header_T *receive_packet; + +int seq_nr = 0; + +/* debug flags */ +int db1 = FALSE; +int db2 = FALSE; +int db3 = FALSE; +int db4 = FALSE; + +char device[MAX_STRING_LEN] = "eth0"; + +/************************** Function prototypes **************************/ + +FILE *Fopen (const char *name, const char *mode); +int main (int argc, const char *argv[]); +int GetNumberOption (int *argNr, int argCount, const char *argVect[], unsigned int *ret, const char *option, int base); +int GetStringOption (int *argNr, int argCount, const char *argVect[], char *ret, const char *option); +int GetRegisterOption (int *argNr, int argCount, const char *argVect[], unsigned int *ret, const char *option, int base); +struct boot_files_T* allocate_boot_file (struct boot_files_T *bf); +struct packet_buf* CreateNewBootPacket (void); +struct packet_buf* allocate_packet (struct packet_buf *p); +void SigHandler (int sig); +void CreateBootLoader (void); +void FinishBootCmds (void); +void ParseArgs (int argc, const char *argv[]); +void PrintHelp (void); +void CreateBootCmds (void); +void handle_labels (void); +void new_label (struct label_t **label, udword addr, const char *name); +unsigned int swap_endian (unsigned int); + +/**************************************************************************** +*# +*# FUNCTION NAME: main +*# +*# PARAMETERS: Command line arguments. +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 961022 ronny Initial version +*# +*#***************************************************************************/ + +int +main(int argc, const char *argv[]) +{ + ParseArgs(argc, argv); + + if (cmdsOnly) { + /* We make this a special case to avoid messing up other code. */ + CreateBootCmds(); + FinishBootCmds(); + SendToDevice(&boot_cmds_packet->data[SIZE_OF_HEADER],SIZE_OF_BOOT_CMDS); + exit(EXIT_SUCCESS); + } + + if (netBoot && !toFiles) { + /* Do not bother with this if we just want to write the packets to + files. Means you do not have to be root to run --tofiles. */ + net_init(); + } + else if (serBoot) { + if (!SetupSerial()) { + exit(0); + } + } + + CreateBootLoader(); + CreateBootCmds(); + FinishBootCmds(); + + printf("Starting boot...\n"); + if (doing_flash) { + printf("We're doing a flash write, this may take up to a few minutes...\n"); + } + + if (toFiles) { + udword seq = 0; + struct packet_buf *p; + + while((p = create_packet(seq++))) { + SendToDevice(p->data, p->size); + } + + exit(EXIT_SUCCESS); + } + + if (netBoot) { + NetBoot(); + } + else if (serBoot) { + SerBoot(); + } + + printf("Done.\n"); + return EXIT_SUCCESS; +} /* main */ + +/**************************************************************************** +*# +*# FUNCTION NAME: free_packet +*# +*# PARAMETERS: struct to free +*# +*# DESCRIPTION: Frees struct and data in struct. +*# +*# RETURNS: Pointer to next struct. +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 2000 02 07 ronny Initial version +*# +*#***************************************************************************/ + +struct packet_buf* +free_packet(struct packet_buf *p) +{ + struct packet_buf *next_p; + + next_p = p->next; + free(p->data); + free(p); + return(next_p); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: create_packet +*# +*# PARAMETERS: Sequence number of desired packet. +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 2000 06 28 ronny Initial version +*# +*#***************************************************************************/ + +struct packet_buf* +create_packet(udword seq) +{ + struct packet_buf *p = first_packet; + /* Should check last first? */ + + if (db4) printf("> create_packet seq %d\n", seq); + + while (p) { + if (p->seq == seq) { + return(p); + } + p = p->next; + } + + return(CreateNewBootPacket()); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: find_string +*# +*# PARAMETERS: New string to search. +*# +*# DESCRIPTION: Searches a number of strings for needle[], including strings +*# overlapping between different calls. +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 020502 ronny Initial version +*# +*#***************************************************************************/ + +void +find_string(char *str) +{ + static int matched = 0; + int hs[MAX_STRING_LEN]; + static int cur_hs = 0; + static int hs_len = 0; + static int last_hs = 0; + + static int cur_needle = 0; + + if (!needle[0]) { + return; + } + // printf("# adding >%s<\n", str); + + { + int c = 0; + int s = 0; + + while((c = str[s])) { + // printf("\n# cur_hs %d, hs_len %d\n", cur_hs, hs_len); + { + int i; + + for(i = 0; i != hs_len; i++) { + // printf("hs[%d] = %d(%c)\n", i, (int)hs[i], hs[i] < 32 ? 'X' : hs[i]); + } + } + + if (cur_hs == hs_len) { + // printf("adding char %d(%c) at hs[%d]\n", (int)c, c < 32 ? 'X' : c, hs_len); + hs[hs_len] = c; + hs_len++; + s++; + } + + // printf("testing %d at cur_hs %d against %d at cur_needle %d\n", + // (int)hs[cur_hs], cur_hs, (int)needle[cur_needle], cur_needle); + + if (hs[cur_hs] == needle[cur_needle]) { + if (cur_needle+1 == needle_len) { + int exitcode = EXIT_SUCCESS; + + // printf("\nFound needle from --find option.\n"); + if (exitonfind) { + int ret; + // printf("scanf (s=%d)'%s'\n", s, &str[s+1]); + ret = sscanf(&str[s+1], "%i", &exitcode); + // printf("ret %d, '%s'\n", ret, &str[s+1]); + } + printf("Exiting with code %d\n", exitcode); + exit(exitcode); + } + cur_needle++; + cur_hs++; + } + else { + // printf("no match, shifting hs.\n"); + { + int i; + for(i=0; i!= hs_len-1; i++) { + hs[i] = hs[i+1]; + } + } + hs_len--; + cur_needle = 0; + cur_hs = 0; + } + } + } +} + +/**************************************************************************** +*# +*# FUNCTION NAME: Fopen +*# +*# PARAMETERS: Name and mode, both strings. +*# +*# DESCRIPTION: Opens a file and returns its fd, or NULL. +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 961022 ronny Initial version +*# +*#***************************************************************************/ + +FILE * +Fopen(const char *name, const char *mode) +{ + FILE *fd; + + if (db2) printf(">>> Fopen '%s', mode '%s'\n", name, mode); + +#if defined(_WIN32) + fd = _fsopen(name, mode, _SH_DENYNO); +#else + fd = fopen(name, mode); +#endif + + if (fd == NULL) { + printf("<<< Fopen failed on '%s', mode '%s'\n", name, mode); + return ((FILE*) NULL); + } + + if (strncmp(mode, "a", 1) == 0) { + if (db3) printf("* Append mode, seeking to end.\n"); + fseek(fd, 0L, SEEK_SET); + } + + if (db2) printf("<<< Fopen: '%s'\n", name); + + return(fd); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: ParseArgs +*# +*# PARAMETERS: Standard command line args. +*# +*# DESCRIPTION: Parses command line arguments. +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 960909 ronny Initial version +*#***************************************************************************/ + +void +ParseArgs (int argc, const char *argv[]) +{ + int argi; + int i; + int printHelp = FALSE; + int exitCode = EXIT_SUCCESS; + char dbStr[MAX_STRING_LEN]; /* Debug option string. */ + int number; + int argCount; + const char **argVect; + struct stat st; + + if (db4) printf(">>> ParseArgs\n"); + argCount = argc; + argVect = argv; + + for (argi = 1; argi < argCount; argi++) { + if (db4) printf("argv[%d] = '%s'\n", argi, argVect[argi]); + if (strncmp(argVect[argi], "--from", 6) == 0) { + if (GetStringOption(&argi, argCount, argVect, host1, "--from") == 0) { + printHelp = TRUE; + exitCode = EXIT_FAILURE; + } + else { + printf("Host: %s %s\n", host1, host2); + if (sscanf(host1, "%x-%x-%x-%x-%x-%x", &i, &i, &i, &i, &i, &i) == 6) { + printf("Ethernet address\n"); + } + } + } + + else if (strncmp(argVect[argi], "--device", 8) == 0) { + if (GetStringOption(&argi, argCount, argVect, device, "--device") == 0) { + printHelp = TRUE; + exitCode = EXIT_FAILURE; + } + } + + else if (strncmp(argVect[argi], "--network", 9) == 0) { + netBoot = TRUE; + serBoot = FALSE; + strcpy(device, "eth0"); + strcpy(boot_loader_file, INTERNAL_NW); + } + + else if (strncmp(argVect[argi], "--serial", 8) == 0) { + serBoot = TRUE; + netBoot = FALSE; + strcpy(device, "/dev/ttyS0"); + strcpy(boot_loader_file, INTERNAL_SER); + } + + else if (strncmp(argVect[argi], "--noleds", 8) == 0) { + noleds = TRUE; + } + + else if (strncmp(argVect[argi], "--images", 8) == 0) { + int i = 0; + + printf("Internal images:\n"); + + while(boot_image_info[i].name) { + printf("'%s', %s, size %lu bytes.\n", + boot_image_info[i].name, + boot_image_info[i].info, + boot_image_info[i].len + ); + i++; + } + exit(EXIT_SUCCESS); + } + + else if (strncmp(argv[argi], "--baudrate", 10) == 0) { + if (GetNumberOption (&argi, argCount, argVect, &set_baudrate, "--baudrate", 10) == 0) { + printHelp = TRUE; + exitCode = EXIT_FAILURE; + } + } + + else if (strncmp(argVect[argi], "--tofiles", 9) == 0) { + toFiles = TRUE; + } + + else if (strncmp(argVect[argi], "--cmdsonly", 10) == 0) { + cmdsOnly = TRUE; + } + + else if (strncmp(argVect[argi], "--to", 4) == 0) { + if ((GetStringOption(&argi, argCount, argVect, host2, "--to") == 0)) { + printHelp = TRUE; + exitCode = EXIT_FAILURE; + } + else { + printf("Host: %s %s\n", host1, host2); + both_addresses = TRUE; + if (sscanf(host2, "%x-%x-%x-%x-%x-%x", &i, &i, &i, &i, &i, &i) == 6) { + printf("Ethernet address\n"); + } + } + } + + else if (strncmp(argVect[argi], "--printp", 8) == 0) { + pPacket = 1; + } + + else if (strncmp(argVect[argi], "--printascii", 11) == 0) { + pPacket = 1; + printPacketType = ASCII; + } + + else if (strncmp(argVect[argi], "--printudec", 11) == 0) { + pPacket = 1; + printPacketType = UDEC; + } + + else if (strncmp(argVect[argi], "--printhex", 10) == 0) { + pPacket = 1; + printPacketType = HEX; + } + + else if (strncmp(argVect[argi], "--bpl", 5) == 0) { + if (GetNumberOption(&argi, argCount, argVect, &p_packet_bpl, "--bpl", 10) == 0) { + printHelp = TRUE; + exitCode = EXIT_FAILURE; + } + } + + else if (strncmp(argVect[argi], "--promisc", 11) == 0) { + promisc = 1; + } + + else if (strncmp(argVect[argi], "--5400", 6) == 0) { + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = 0xb0000000; + boot_cmds[boot_cmds_cnt++] = 0x000095b6; + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = 0xb0000008; + boot_cmds[boot_cmds_cnt++] = 0x0000e751; + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = 0xb000000c; + boot_cmds[boot_cmds_cnt++] = 0x12604040; + } + + else if (strncmp(argVect[argi], "--5600", 6) == 0) { + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = 0xb0000000; + boot_cmds[boot_cmds_cnt++] = 0x000095b6; + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = 0xb0000008; + boot_cmds[boot_cmds_cnt++] = 0x00006751; + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = 0xb000000c; + boot_cmds[boot_cmds_cnt++] = 0x12204040; + } + + else if (strncmp(argVect[argi], "--testcardlx", 12) == 0) { + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = (unsigned int)R_DRAM_CONFIG; + boot_cmds[boot_cmds_cnt++] = 0x12604040; + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = (unsigned int)R_DRAM_TIMING; + boot_cmds[boot_cmds_cnt++] = 0x0000e751; + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = (unsigned int)R_WAITSTATES; + boot_cmds[boot_cmds_cnt++] = 0x00b395b5; + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = (unsigned int)R_BUS_CONFIG; + boot_cmds[boot_cmds_cnt++] = 0x00000207; + } + + else if (strncmp(argVect[argi], "--testcard", 10) == 0) { + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = (unsigned int)R_WAITSTATES; + boot_cmds[boot_cmds_cnt++] = 0x000010b3; + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = (unsigned int)R_DRAM_TIMING; + boot_cmds[boot_cmds_cnt++] = 0x00006543; + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = (unsigned int)R_DRAM_CONFIG; + boot_cmds[boot_cmds_cnt++] = 0x12966060; + } + + else if (strncmp(argVect[argi], "--devboard", 10) == 0) { + /* Printing on serial port will not work until PORT_PB is set... */ + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = (unsigned int)R_PORT_PB_SET; + boot_cmds[boot_cmds_cnt++] = 0x01001ef3; + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = (unsigned int)R_PORT_PA_SET; + boot_cmds[boot_cmds_cnt++] = 0x00001df0; + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = (unsigned int)R_WAITSTATES; + boot_cmds[boot_cmds_cnt++] = 0x000095a6; + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = (unsigned int)R_DRAM_CONFIG; + boot_cmds[boot_cmds_cnt++] = 0x1a200040; + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = (unsigned int)R_DRAM_TIMING; + boot_cmds[boot_cmds_cnt++] = 0x00005611; + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = (unsigned int)R_BUS_CONFIG; + boot_cmds[boot_cmds_cnt++] = 0x00000104; + } + + else if (strncmp(argVect[argi], "--verify", 8) == 0) { + boot_cmds[boot_cmds_cnt++] = MEM_VERIFY; + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--verify", 16); + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--verify", 16); + } + + else if (strncmp(argVect[argi], "--setreg", 8) == 0) { + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + if ((argVect[argi+1][0] >= 'A') && (argVect[argi+1][0] <= 'Z')) { + GetRegisterOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--setreg", 16); + } + else { + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--setreg", 16); + } + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--setreg", 16); + } + + else if (strncmp(argVect[argi], "--getreg", 8) == 0) { + boot_cmds[boot_cmds_cnt++] = GET_REGISTER; + if ((argVect[argi+1][0] >= 'A') && (argVect[argi+1][0] <= 'Z')) { + GetRegisterOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--getreg", 16); + } + else { + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--getreg", 16); + } + } + + else if (strncmp(argVect[argi], "--pause", 7) == 0) { + boot_cmds[boot_cmds_cnt++] = PAUSE_LOOP; + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--pause", 16); + } + + else if (strncmp(argVect[argi], "--memtest", 9) == 0) { + boot_cmds[boot_cmds_cnt++] = MEM_TEST; + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--memtest", 16); + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--memtest", 16); + } + + else if (strncmp(argVect[argi], "--loop", 6) == 0) { + char str[MAX_STRING_LEN]; + boot_cmds[boot_cmds_cnt++] = LOOP; + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--loop", 16); + GetStringOption(&argi, argCount, argVect, str, argVect[argi]); + new_label(&loop_label, boot_cmds_cnt+1, str); + boot_cmds_cnt++; + } + + else if (strncmp(argVect[argi], "--label", 7) == 0) { + char str[MAX_STRING_LEN]; + GetStringOption(&argi, argCount, argVect, str, "--label"); + new_label(&label, boot_cmds_cnt, str); + } + + else if (strncmp(argVect[argi], "--memdump", 9) == 0) { + boot_cmds[boot_cmds_cnt++] = MEM_DUMP; + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--memdump", 16); + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--memdump", 16); + } + + else if (strncmp(argVect[argi], "--memclear", 10) == 0) { + boot_cmds[boot_cmds_cnt++] = MEM_CLEAR; + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--memclear", 16); + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--memclear", 16); + } + + else if (strncmp(argVect[argi], "--flash", 7) == 0) { + boot_cmds[boot_cmds_cnt++] = FLASH; + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--flash", 16); + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--flash", 16); + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--flash", 16); + doing_flash = TRUE; + } + + else if (strncmp(argVect[argi], "--jump", 6) == 0) { + boot_cmds[boot_cmds_cnt++] = JUMP; + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--jump", 16); + } + + else if (strncmp(argVect[argi], "--file", 6) == 0) { + char str[MAX_STRING_LEN]; + boot_cmds[boot_cmds_cnt++] = PACKET_INFO; + GetStringOption(&argi, argCount, argVect, + str, "--file"); /* file name */ + GetNumberOption(&argi, argCount, argVect, + &boot_cmds[boot_cmds_cnt++], str, 16); /* address */ + last_boot_file = allocate_boot_file(last_boot_file); + first_boot_file = first_boot_file ? first_boot_file : last_boot_file; + last_boot_file->fileName = malloc(strlen(str) + 1); + strcpy(last_boot_file->fileName, str); + last_boot_file->size_p = &boot_cmds[boot_cmds_cnt]; + last_boot_file->size_sent = 0; + if (strncmp(str, "-", 1) != 0) { + if (stat(last_boot_file->fileName, &st) == -1) { + printf("Cannot get size of file '%s'. %s.\n", + last_boot_file->fileName, strerror(errno)); + exit(EXIT_FAILURE); + } + if (db2) printf("* size is %d 0x%8.8x\n", + (int)st.st_size, (unsigned int)st.st_size); + last_boot_file->size = st.st_size; + boot_cmds[boot_cmds_cnt++] = st.st_size; + } + else { + GetNumberOption(&argi, argCount, argVect, + &last_boot_file->size , str, 16); /* size */ + + boot_cmds[boot_cmds_cnt++] = last_boot_file->size; + printf("* size is %d 0x%8.8x\n", last_boot_file->size, + last_boot_file->size); + } + } + + else if (strncmp(argVect[argi], "--bootfile", 10) == 0) { + GetStringOption(&argi, argCount, argVect, + boot_loader_file, "--bootfile"); + } + + else if (strncmp(argVect[argi], "-d", 2) == 0) { + if (GetNumberOption (&argi, argCount, argVect, &number, "-d", 10) == 0) { + printHelp = TRUE; + exitCode = EXIT_FAILURE; + } + else { + sprintf(dbStr, "%d", number); + for (i = 0; i != (int) strlen(dbStr); i++) { + switch (dbStr[i] - '0') { + case 1: + db1 = TRUE; + break; + case 2: + db2 = TRUE; + break; + case 3: + db3 = TRUE; + break; + case 4: + db4 = TRUE; + break; + default: + printf("ERROR! Debug level %d is not defined.\n", dbStr[i] - '0'); + printHelp = TRUE; + exitCode = EXIT_FAILURE; + break; + } + } + } + } + + else if (strncmp(argVect[argi], "--find", 6) == 0) { + GetStringOption(&argi, argCount, argVect, needle, "--find"); + /* convert control characters like /n to the real ascii valure */ + { + int i; + int j = 0; + char c; + int esc = 0; + + for (i = 0; (c = needle[i]); i++,j++) { +// printf("c = %d, i %d, j %d\n", (int)c, i, j); + if (c == '\\') { +// printf("esc\n"); + esc = 1; + continue; + } + else if (esc) { + esc = 0; + switch(c) { + case 'r': + c = '\r'; + break; + + case 'n': + c = '\n'; + break; + + case '\\': + c = '\\'; + break; + + default: + printf("Uknown escape sequence '\\%c'\n", c); + exit(EXIT_FAILURE); + } + j--; + } + // printf("setting j %d to %d\n", j, (int)c); + needle[j] = c; + } + needle_len = j; + } + + for (i = 0; needle[i]; i++) { + //printf("i = %d, c %d\n", i,(int)needle[i]); + } + } + + else if (strncmp(argVect[argi], "--exitonfind", 12) == 0) { + exitonfind = TRUE; + } + + else if (strncmp(argVect[argi], "--help", 6) == 0) { + printHelp = TRUE; + } + + else { + printf("ERROR! Don't understand option '%s'\n", argVect[argi]); + printHelp = TRUE; + exitCode = EXIT_FAILURE; + } + } + + if (printHelp == TRUE) { + PrintHelp(); + exit(exitCode); + } + + if (noleds) { + strcpy(&boot_loader_file[strlen(boot_loader_file)], "_NOLEDS"); + } + + handle_labels(); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: handle_labels +*# +*# PARAMETERS: global loop_label, label +*# +*# DESCRIPTION: Checks and matches labels from --loop and --label commands +*# and inserts the resolved addresses into boot commands. +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 20020204 ronny Initial version +*# +*#***************************************************************************/ + +void +handle_labels(void) +{ + struct label_t *ll = loop_label; + struct label_t *l = label; + struct label_t *last_l = l; + + while(ll) { + int match = 0; + + l = last_l; + while(l) { + match = 0; + + if (l->name && ll->name && (strcmp(l->name, ll->name) == 0)) { + match = 1; + boot_cmds[ll->addr] = IO_BUF_START+(l->addr*4); + break; + } + l = l->prev; + } + if (!match) { + printf("Error. No label '%s' defined as needed by --loop command.\n", ll->name); + exit(EXIT_FAILURE); + } + ll = ll->prev; + } +} + +/**************************************************************************** +*# +*# FUNCTION NAME: new_label +*# +*# PARAMETERS: +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 20020201 ronny Initial version +*# +*#***************************************************************************/ + +void +new_label(struct label_t **label, udword addr, const char *name) +{ + struct label_t *new_p; + + new_p = malloc(sizeof(struct label_t)); + + if (*label == NULL) { /* first one? */ + *label = new_p; + new_p->prev = NULL; + } + else { + new_p->prev = *label; + } + *label = new_p; + new_p->addr = boot_cmds_cnt; + new_p->name = malloc(strlen(name)); + strcpy(new_p->name, name); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: GetStringOption +*# +*# PARAMETERS: int *argNr : Returns next argc here. +*# int argCount : Index of last argument. +*# char *argVect[] : argv. +*# char *ret : Copy string here. +*# char *option : Name of the option. +*# +*# DESCRIPTION: Extracts a string option from argv, and updates argnr. +*# Returns TRUE/FALSE and string in *ret. +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 960930 ronny Initial version +*# 961203 ronny Handles filenames with spaces within 'file name'. +*# +*#***************************************************************************/ + +int +GetStringOption(int *argNr, int argCount, const char *argVect[], char *ret, + const char *option) +{ + int startChar = strlen(option); + + *ret = '\0'; + + /* Are there any more chars after option? If not skip to next argv. */ + if (strlen(argVect[*argNr]) <= (unsigned int)startChar) { + (*argNr)++; + startChar = 0; + } + + /* Any args left? */ + if (*argNr >= argCount) { + printf("ERROR! The option '%s' needs a string argument.\n", option); + PrintHelp(); + exit(EXIT_FAILURE); + } + + /* avoid stack overflow hacks */ + if (strlen(&argVect[*argNr][startChar]) > MAX_STRING_LEN) { + printf("Argument '%s' longer than maximum allowable %d characters.\n", + &argVect[*argNr][startChar], MAX_STRING_LEN); + exit(EXIT_FAILURE); + } + + strcpy(ret, &argVect[*argNr][startChar]); + if (db4) printf("<<< GetStringOption '%s'\n", ret); + + return TRUE; +} + +/**************************************************************************** +*# +*# FUNCTION NAME: GetNumberOption +*# +*# PARAMETERS: +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 960930 ronny Initial version +*# +*#***************************************************************************/ + +int +GetNumberOption(int *argNr, int argCount, const char *argVect[], + unsigned int *ret, const char *option, int base) +{ + int startChar = 0; + int add_io_base = 0; + + (*argNr)++; + + if (*argNr >= argCount) { + printf("ERROR! The option '%s' needs a number argument.\n", option); + PrintHelp(); + exit(EXIT_FAILURE); + } + + if (argVect[*argNr][startChar] == '+') { + add_io_base = 1; + startChar++; + } + + *ret = strtoul(&argVect[*argNr][startChar], NULL, base); + + if (add_io_base) { + *ret += IO_BUF_START; + if (*ret < IO_BUF_START || *ret >= IO_BUF_END) { + printf("ERROR! '%s' is outside the IO buffer (option '%s').\n", + argVect[*argNr], option); + exit(EXIT_FAILURE); + } + } + + if (db4) printf("<<< GetNumberOption %08x\r\n", *ret); + + return TRUE; +} + +/**************************************************************************** +*# +*# FUNCTION NAME: GetRegisterOption +*# +*# PARAMETERS: +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 960930 ronny Initial version +*# +*#***************************************************************************/ + +int +GetRegisterOption(int *argNr, int argCount, const char *argVect[], + unsigned int *ret, const char *option, int base) +{ + int startChar = 0; + + (*argNr)++; + + if (*argNr >= argCount) { + printf("Error! The option '%s' needs a register name.\n", option); + PrintHelp(); + exit(EXIT_FAILURE); + } + + { + int r = 0; + + while (reg_des[r].name) { + if (strcmp(reg_des[r].name, argVect[*argNr]) == 0) { + *ret = reg_des[r].addr; + return TRUE; + break; + } + r++; + } + } + + printf("Error! Didn't find a register name matching '%s'.\n", + argVect[*argNr]); + + exit(EXIT_FAILURE); + + return FALSE; +} + +/**************************************************************************** +*# +*# FUNCTION NAME: PrintHelp +*# +*# PARAMETERS: None. +*# +*# DESCRIPTION: Prints help info. +*# +*#--------------------------------------------------------------------------- +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 960909 ronny Initial version +*# +*#***************************************************************************/ + +void +PrintHelp(void) +{ + printf("e100boot version %s.\n", version); + + printf("\ne100boot [--device devicename] [--file filename|- addr [size]]\n" + " [--flash ram-source flash-offset size]\n" + " [--pause iter]\n" + " [--memtest addr addr]\n" + " [--memclear addr addr] [--memdump addr addr]\n" + " [--setreg addr|regname val] [--getreg addr|regname]\n" + " [--verify addr val] [--label label] [--loop addr label]\n" + " [--5400] [--5600] [--testcard] [--devboard]\n" + " [--testcardlx] [--network] [--serial]\n" + " [--baudrate baudrate] [--bootfile file] [--jump addr]\n" + " [--tofiles] [--cmdsonly] [--images] [--noleds]\n" + " [--help]\n\n"); + + printf(" The commands sent to the cbl, and which are parsed by the cbl,\n" + " are stored at 0x%8.8x-0x%8.8x.\n\n", IO_BUF_START, IO_BUF_END); + + printf(" See the man page for more details about e100boot.\n\n"); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: CreateBootLoader +*# +*# PARAMETERS: None. +*# +*# DESCRIPTION: Creates boot packets from boot file or internal loader. +*# +*#--------------------------------------------------------------------------- +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 960909 ronny Initial version +*#***************************************************************************/ + +void +CreateBootLoader(void) +{ + struct stat st; + char *buf = NULL; + // int size_pos = 0x18; + // int addr_pos = 0x28; + struct packet_header_T *ph; + int packet_size; + int header_size; + int buf_cnt = 0; + int i; + udword sum = 0; + + if (create_boot_loader) { + int image_nbr = 0; + int found = 0; + const struct boot_image_info_type *info; + + if (db4) printf("> CreateBootLoader\n"); + + info = &boot_image_info[image_nbr]; + + /* Use internal boot loader? */ + while (!found && info->name != NULL) { + if (strcmp(boot_loader_file, info->name) == 0) { + st.st_size = info->len; + buf = (char*) malloc(st.st_size); + memcpy(buf, info->ptr, st.st_size); /* unnecessary? */ + found = TRUE; + printf("Using internal boot loader: %s - %s.\n", + info->name, info->info); + } + else { + image_nbr++; + info = &boot_image_info[image_nbr]; + } + } + + /* No internal? Load it from file instead. */ + if (!found) { + FILE *fd; + + /* We didn't find an internal match, load the boot file from disk. */ + if ((fd = Fopen(boot_loader_file, "r")) == NULL) { + printf("Cannot open bootloader '%s'. %s.\n", + boot_loader_file, strerror(errno)); + exit(EXIT_FAILURE); + } + + if (fstat(fileno(fd), &st) == -1) { + printf("Cannot get filestatus of bootloader '%s'. %s.\n", + boot_loader_file, strerror(errno)); + exit(EXIT_FAILURE); + } + + buf = (char*) malloc(st.st_size); + // printf("CreateBootLoader: buf = (char*) malloc(st.st_size); 2\n"); + if (read(fileno(fd), buf, st.st_size) != st.st_size) { + printf("Read fewer bytes than there should be in %s.\n", + boot_loader_file); + exit(EXIT_FAILURE); + } + + fclose(fd); + } + + /* Alright, got loader in buf[] and size in st. */ + if (netBoot) { + /* The etrax code for all boot methods are linked to adress + 380000f0 but since network boot starts execution at 380000f4 + we have two nops in the beginning of the code which we do not + transmit to etrax in the network case. The link adress + doesn't change though. */ + buf += 4; + st.st_size -= 4; + packet_size = DATA_SIZE; + } + else { + packet_size = st.st_size; + } + + /* Hack binary, insert size and address. */ + + /* Giovanni Varasano (24/06/2005) : bug + * It is not a good habit to make code endian dependent on the host + * processor where cross compilation happens. Intel is little endian and + * PowerPC is big endian, but the target (ETRAX) is always little endian. + * The use of swap_endian() solves the problem. + */ + +#define SIZE_PATTERN 0x12345678 +#define ADDR_PATTERN 0x87654321 +#define SIZE_POS (netBoot ? 0x0c : 0x10) +#define ADDR_POS (netBoot ? 0x10 : 0x14) + + if (swap_endian(*(udword*)&buf[SIZE_POS]) != SIZE_PATTERN) { + printf("Bootloader corrupt. Should contain ret/nop (0x%8.8x) at 0x%x, but contains %x\n", + SIZE_PATTERN, SIZE_POS, *(udword*)&buf[SIZE_POS]); + exit(EXIT_FAILURE); + } + + /* How much data to load except data in first packet. */ + + if (netBoot) { + *(udword*)(&buf[SIZE_POS]) = swap_endian(st.st_size - DATA_SIZE); + } + else { + *(udword*)(&buf[SIZE_POS]) = swap_endian(st.st_size - 784); + } + + if (db3) printf("Inserting boot size 0x%x at 0x%x.\n", + (unsigned int) *(udword*)(&buf[SIZE_POS]), + (unsigned int)&buf[SIZE_POS]); + + if (swap_endian(*(udword*)&buf[ADDR_POS]) != ADDR_PATTERN) { + printf("Bootloader corrupt. Should contain ret/nop (0x%8.8x) at 0x%x, but contains %x\n", + ADDR_PATTERN, ADDR_POS, *(udword*)&buf[ADDR_POS]); + exit(EXIT_FAILURE); + } + + if (netBoot) { + *(udword*)(&buf[ADDR_POS]) = swap_endian(BOOT_ADDRESS + DATA_SIZE); + } + else { + *(udword*)(&buf[ADDR_POS]) = swap_endian(BOOT_ADDRESS-4 + 784); + } + + if (db3) printf("Inserting boot address 0x%x at 0x%x.\n", + (unsigned int)*(udword*)(&buf[ADDR_POS]), + (unsigned int)&buf[ADDR_POS]); + + + for (i = 0; i != st.st_size; i++) { + sum += ((byte*)buf)[i]; + } + if (db1) printf("Checksum 0x%x, bytes %d\n", sum, i); + + if (db4) { + int i; + + for(i=0; isize = packet_size; + last_packet->data = (char*)malloc(packet_size); + last_packet->seq = seq_nr; + last_packet->baud_rate = 9600; + + last_packet->boot_file = allocate_boot_file(NULL); + last_packet->boot_file->fileName = boot_loader_file; + + // printf("last_packet->size %8.8x\n", last_packet->size); + // printf("last_packet->data %8.8x\n",last_packet->data); + + if (netBoot) { + ph = (struct packet_header_T*) last_packet->data; + memcpy(ph->dest, dst_addr_of_device, 6); + memcpy(ph->src, eth_addr_local, 6); + ph->length = htons(packet_size); + ph->snap1 = htonl(SNAP1); + ph->snap2 = htonl(SNAP2); + ph->tag = htonl(SERVER_TAG); + ph->seq = htonl(seq_nr); + if (seq_nr != 0) { + ph->type = htonl(BOOT_PACKET); + ph->id = htonl(0); + } + } + + memcpy(&last_packet->data[header_size], &buf[buf_cnt], + packet_size - header_size); + if (db3) DecodeSvintoBoot(last_packet->data); + + if (netBoot) { + buf_cnt += DATA_SIZE; + } + else { + buf_cnt += packet_size +1; + } + + seq_nr++; + } + } + + if (db4) printf("< CreateBootLoader\n"); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: allocate_packet +*# +*# PARAMETERS: None. +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 960909 ronny Initial version +*#***************************************************************************/ + +struct packet_buf* +allocate_packet(struct packet_buf *p) +{ + if (db4) printf("> allocate_packet\n"); + + if (p) { + p->next = (struct packet_buf*) malloc(sizeof(struct packet_buf)); + p = p->next; + } + else { + p = (struct packet_buf*) malloc(sizeof(struct packet_buf)); + } + p->next = NULL; + + return(p); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: allocate_boot_file +*# +*# PARAMETERS: None. +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 960909 ronny Initial version +*#***************************************************************************/ + +struct boot_files_T* +allocate_boot_file(struct boot_files_T *bf) +{ + if (bf) { + bf->next = (struct boot_files_T*) malloc(sizeof(struct boot_files_T)); + bf = bf->next; + } + else { + bf = (struct boot_files_T*) malloc(sizeof(struct boot_files_T)); + } + bf->next = NULL; + + return(bf); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: CreateBootCmds +*# +*# PARAMETERS: None. +*# +*# DESCRIPTION: Creates a boot packet from the boot commands. The data is +*# filled in later by FinishBootCmds(). +*# +*#--------------------------------------------------------------------------- +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 980818 ronny Initial version +*#***************************************************************************/ + +void +CreateBootCmds(void) +{ + struct packet_header_T *ph; + + if (db4) printf("***> CreateBootCmds\n"); + + last_packet = allocate_packet(last_packet); + + boot_cmds_packet = last_packet; + + last_packet->boot_file = allocate_boot_file(NULL); + last_packet->boot_file->fileName = BOOT_CMDS_FILE; + last_packet->baud_rate = 9600; + + last_packet->size = netBoot ? SIZE_OF_BOOT_CMDS + sizeof(struct packet_header_T) + : SIZE_OF_BOOT_CMDS; + + last_packet->data = (char *) malloc(last_packet->size); + last_packet->seq = seq_nr; + + if (netBoot) { + /* Create packet header. */ + ph = (struct packet_header_T *) last_packet->data; + memcpy(ph->dest, dst_addr_of_device, 6); + memcpy(ph->src, eth_addr_local, 6); + ph->length = htons(last_packet->size); + ph->snap1 = htonl(SNAP1); + ph->snap2 = htonl(SNAP2); + ph->tag = htonl(SERVER_TAG); + ph->seq = htonl(seq_nr); + seq_nr++; + ph->type = htonl(BOOT_CMDS); + ph->id = htonl(0); + } + + if (db3) DecodeSvintoBoot(last_packet->data); + if (db4) printf("<*** CreateBootCmds\n"); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: FinishBootCmds +*# +*# PARAMETERS: None. +*# +*# DESCRIPTION: Copies the boot commands into the correct packet and changes +*# the dwords to network order. +*# +*#--------------------------------------------------------------------------- +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 960909 ronny Initial version +*#***************************************************************************/ + +void +FinishBootCmds(void) +{ + int i; + unsigned int offset = 0; + + for (i = 0; i != boot_cmds_cnt; i++) { + boot_cmds[i] = htonl(boot_cmds[i]); + if (db3) printf("%8.8x\n", boot_cmds[i]); + } + + /* Copy boot commands into packet. */ + if (netBoot) { + offset = sizeof(struct packet_header_T); + } + + memcpy(&boot_cmds_packet->data[offset], boot_cmds, + boot_cmds_cnt * sizeof(udword)); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: CreateNewBootPacket +*# +*# PARAMETERS: None. +*# +*# DESCRIPTION: Creates next packet for the files specified by '--file'. +*# +*# RETURNS: Next packet, or NULL. +*# +*#--------------------------------------------------------------------------- +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 960909 ronny Initial version +*#***************************************************************************/ + +struct packet_buf* +CreateNewBootPacket(void) +{ + static char buf[DATA_SIZE]; + struct packet_header_T *ph; + int packet_size; + int header_size; + int i; + udword sum; + int size = 0; + int padding = 0; + + static struct boot_files_T *bf = NULL; + + if (db3) printf("> CreateNewBootPacket\n"); + + bf = bf ? bf : first_boot_file; + + while (bf) { + if (!bf->fd) { + if (strcmp(bf->fileName, "-") == 0) { + bf->fd = stdin; + } + else { + bf->fd = fopen(bf->fileName, "r"); + } + + if (bf->fd == NULL) { + printf("Cannot open boot file %s. Exiting\n", bf->fileName); + exit(EXIT_FAILURE); + } + if (db3) printf("Opening boot file %s\n", bf->fileName); + } + + if (!padding) { + size = fread(buf, 1, DATA_SIZE, bf->fd); + if (size == 0) { + if (db3) printf("Nothing more to read. Read: %d/%d\n", + bf->size_sent, bf->size); + padding = 1; + } + } + + if (padding) { + if (bf->size_sent < bf->size) { + if (db3) printf("padding...\n"); + size = (bf->size - bf->size_sent > DATA_SIZE) ? + DATA_SIZE : bf->size - bf->size_sent; + memset(buf, 0, size); + } + else { + if (db3) printf("All written\n"); + padding = 0; + size = 0; + } + } + + if (size != 0) { + if (db3) printf("size: %d %d/%d\n", size, bf->size_sent, bf->size); + bf->size_sent += size; + last_packet = allocate_packet(last_packet); + + /* Calculate checksum. */ + sum = 0; + for (i = 0; i != size; i++) { + sum += ((byte*)buf)[i]; + } + if (db2) printf("Checksum 0x%x, bytes %d\n", sum, i); + + /* Figure out size of packet. */ + if (netBoot) { + header_size = seq_nr == 0 ? + SIZE_OF_FIRST_HEADER : sizeof(struct packet_header_T); + + packet_size = ((size) < DATA_SIZE ? size : DATA_SIZE) + header_size; + } + else { + header_size = 0; + packet_size = size; + } + + if (packet_size < 60) { /* CRC adds 4 bytes to 64 */ + printf( + "Last packet from file '%s', is smaller than 64 bytes. \n" + "This is not allowed in the Ethernet standard. Will pad with %d " + "bytes.\n", bf->fileName, 60-packet_size); + + *(bf->size_p) += 60-packet_size; + packet_size = 60; + } + + last_packet->size = packet_size; + last_packet->data = (char*)malloc(packet_size); + last_packet->boot_file = bf; + last_packet->baud_rate = set_baudrate; + + /* printf("size %8.8x\n", last_packet->size);*/ + /* printf("data %8.8x\n",last_packet->data);*/ + + if (netBoot) { + /* Initialize ethernet header. */ + ph = (struct packet_header_T*) last_packet->data; + memcpy(ph->dest, dst_addr_of_device, 6); + memcpy(ph->src, eth_addr_local, 6); + /* printf("packet_size %d\n", packet_size);*/ + ph->length = htons(packet_size); + ph->snap1 = htonl(SNAP1); + ph->snap2 = htonl(SNAP2); + ph->tag = htonl(SERVER_TAG); + ph->seq = htonl(seq_nr); + last_packet->seq = seq_nr; + if (seq_nr != 0) { + ph->type = htonl(BOOT_PACKET); + ph->id = htonl(0); /* id doesn't matter, we send to a unicast address */ + } + } + + /* Copy data in place. */ + memcpy(&last_packet->data[header_size], buf, packet_size - header_size); + if (db2) DecodeSvintoBoot(last_packet->data); + /* PrintPacket(last_packet->data, last_packet->size, HEX);*/ + seq_nr++; + + if (db3) printf("< CreateNewBootPacket\n"); + return(last_packet); + } + else { /* Nothing read from fd. */ + fclose(bf->fd); + bf = bf->next; + } + } + + if (db3) printf("< CreateNewBootPacket\n"); + return(NULL); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: swap_endian +*# +*# PARAMETERS: u - An unsigned value. +*# +*# DESCRIPTION: Convert the unsigned value from host order to little endian. +*# +*# RETURNS: The unsigned value as little endian. +*# +*#***************************************************************************/ + +unsigned int +swap_endian(unsigned int u) +{ + /* If the host order is the same as the network order (which is big endian), + * we need to swap the bytes in the supplied value. + */ + return ntohl(0x12345678) == 0x12345678 ? bswap_32(u) : u; +} + +/****************** END OF FILE common.c ************************************/ diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/common.h b/target/linux/etrax-2.6/image/e100boot/src/sbl/common.h new file mode 100644 index 0000000000..8f854e447a --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/common.h @@ -0,0 +1,57 @@ +/*!*************************************************************************** +*! +*! FILE NAME : common.h +*! +*! DESCRIPTION: Common stuff for e100boot. +*! +*! --------------------------------------------------------------------------- +*! HISTORY +*! +*! DATE NAME CHANGES +*! ---- ---- ------- +*! 2002 05 02 Ronny Ranerup Initial version +*! --------------------------------------------------------------------------- +*! (C) Copyright 1999, 2000, 2001, 2002 Axis Communications AB, LUND, SWEDEN +*!***************************************************************************/ +/************************** Include files ********************************/ +/************************** Constants and macros *************************/ +/* max length of argument strings */ +#define MAX_STRING_LEN 256 +/************************** Type definitions *****************************/ +struct packet_buf { + unsigned int size; + struct packet_buf *next; + unsigned int seq; + char *data; + struct boot_files_T *boot_file; + unsigned int baud_rate; +}; + +struct boot_files_T { + char *fileName; + unsigned int *size_p; /* Pointer to size in boot_cmds. */ + unsigned int size; /* Size of file. */ + unsigned int size_sent; /* Number of bytes sent so far. */ + struct boot_files_T *next; + FILE *fd; +}; + +/************************** Global variables *****************************/ +extern int db1; +extern int db2; +extern int db3; +extern int db4; + +extern char device[MAX_STRING_LEN]; +extern struct packet_buf *first_packet; +extern int cmdsOnly; /* Just dump boot cmds to file. */ +extern int toFiles; /* Dump all packets to files. */ + +/************************** Function prototypes **************************/ + +struct packet_buf* create_packet (unsigned int seq); +struct packet_buf* free_packet (struct packet_buf *p); +void find_string (char *str); + + + diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/conf.h b/target/linux/etrax-2.6/image/e100boot/src/sbl/conf.h new file mode 100644 index 0000000000..4105bbffbd --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/conf.h @@ -0,0 +1,139 @@ +/* conf.h. Generated automatically by configure. */ +#define HAVE_NET_IF_H 1 +#define HAVE_NETINET_IN_H 1 /* Socket data structure */ +#define HAVE_NETINET_IN_SYSTM_H 1 +#define HAVE_NETINET_IP_H 1 +#define HAVE_NETINET_UDP_H 1 +#define HAVE_NETINET_TCP_H 1 +#define HAVE_NETDB_H 1 +#define HAVE_ARPA_INET_H 1 +#define HAVE_SYS_SOCKET_H 1 +#define HAVE_FCNTL_H 1 /* O_RDONLY */ +#define HAVE_LINUX_IF_ETHER_H 1 +#define HAVE_SIGNAL_H 1 +#define HAVE_STRING_H 1 +#define HAVE_STDLIB_H 1 +#define HAVE_STDIO_H 1 +#define HAVE_SYS_TIME_H 1 +#define HAVE_UNISTD_H 1 +#define HAVE_SYS_STAT_H 1 +#define HAVE_SYS_TYPES_H 1 +#define HAVE_ERRNO_H 1 +#define HAVE_LINUX_SOCKIOS_H 1 /* SIOCGIFHWADDR */ +#define HAVE_CTYPE_H 1 +#define HAVE_PCAP_H 0 +#define TIME_WITH_SYS_TIME 1 +#define HAVE_SYS_SOCKET_H 1 +#define HAVE_SYS_IOCTL_H 1 +#define HAVE_TERMIOS_H 1 + +#if HAVE_TERMIOS_H +#include +#endif + +#if HAVE_SYS_IOCTL_H +#include +#endif + +#if HAVE_SYS_TYPES_H +#include +#endif + +#if HAVE_CTYPE_H +#include +#endif + +#if HAVE_SYS_SOCKET_H +#include +#endif + +#if HAVE_NETINET_IN_H +#include +#endif + +#if HAVE_NET_IF_H +#include +#endif + +#if HAVE_NETINET_IN_SYSTM_H +#include +#endif + +#if HAVE_NETINET_IP_H +#include +#endif + +#if HAVE_NETINET_UDP_H +#include +#endif + +#if HAVE_NETINET_TCP_H +#include +#endif + +#if HAVE_NETDB_H +#include +#endif + +#if HAVE_ARPA_INET_H +#include +#endif + +#if HAVE_SYS_SOCKET_H +#include +#endif + +#if HAVE_FCNTL_H +#include +#endif + +#if HAVE_LINUX_IF_ETHER_H +#include +#endif + +#if HAVE_SIGNAL_H +#include +#endif + +#if HAVE_STRING_H +#include +#endif + +#if HAVE_STDLIB_H +#include +#endif + +#if HAVE_STDIO_H +#include +#endif + +#if HAVE_UNISTD_H +#include +#endif + +#if HAVE_SYS_STAT_H +#include +#endif + +#if HAVE_ERRNO_H +#include +#endif + +#if HAVE_LINUX_SOCKIOS_H +#include +#endif + +#if HAVE_PCAP_H +#include +#endif + +#if TIME_WITH_SYS_TIME +#include +#include +#else +#if HAVE_SYS_TIME_H +#include +#else +#include +#endif +#endif diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/conf.h.in b/target/linux/etrax-2.6/image/e100boot/src/sbl/conf.h.in new file mode 100644 index 0000000000..779c473141 --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/conf.h.in @@ -0,0 +1,138 @@ +#define HAVE_NET_IF_H 0 +#define HAVE_NETINET_IN_H 0 /* Socket data structure */ +#define HAVE_NETINET_IN_SYSTM_H 0 +#define HAVE_NETINET_IP_H 0 +#define HAVE_NETINET_UDP_H 0 +#define HAVE_NETINET_TCP_H 0 +#define HAVE_NETDB_H 0 +#define HAVE_ARPA_INET_H 0 +#define HAVE_SYS_SOCKET_H 0 +#define HAVE_FCNTL_H 0 /* O_RDONLY */ +#define HAVE_LINUX_IF_ETHER_H 0 +#define HAVE_SIGNAL_H 0 +#define HAVE_STRING_H 0 +#define HAVE_STDLIB_H 0 +#define HAVE_STDIO_H 0 +#define HAVE_SYS_TIME_H 0 +#define HAVE_UNISTD_H 0 +#define HAVE_SYS_STAT_H 0 +#define HAVE_SYS_TYPES_H 0 +#define HAVE_ERRNO_H 0 +#define HAVE_LINUX_SOCKIOS_H 0 /* SIOCGIFHWADDR */ +#define HAVE_CTYPE_H 0 +#define HAVE_PCAP_H 0 +#define TIME_WITH_SYS_TIME 0 +#define HAVE_SYS_SOCKET_H 0 +#define HAVE_SYS_IOCTL_H 0 +#define HAVE_TERMIOS_H 0 + +#if HAVE_TERMIOS_H +#include +#endif + +#if HAVE_SYS_IOCTL_H +#include +#endif + +#if HAVE_SYS_TYPES_H +#include +#endif + +#if HAVE_CTYPE_H +#include +#endif + +#if HAVE_SYS_SOCKET_H +#include +#endif + +#if HAVE_NETINET_IN_H +#include +#endif + +#if HAVE_NET_IF_H +#include +#endif + +#if HAVE_NETINET_IN_SYSTM_H +#include +#endif + +#if HAVE_NETINET_IP_H +#include +#endif + +#if HAVE_NETINET_UDP_H +#include +#endif + +#if HAVE_NETINET_TCP_H +#include +#endif + +#if HAVE_NETDB_H +#include +#endif + +#if HAVE_ARPA_INET_H +#include +#endif + +#if HAVE_SYS_SOCKET_H +#include +#endif + +#if HAVE_FCNTL_H +#include +#endif + +#if HAVE_LINUX_IF_ETHER_H +#include +#endif + +#if HAVE_SIGNAL_H +#include +#endif + +#if HAVE_STRING_H +#include +#endif + +#if HAVE_STDLIB_H +#include +#endif + +#if HAVE_STDIO_H +#include +#endif + +#if HAVE_UNISTD_H +#include +#endif + +#if HAVE_SYS_STAT_H +#include +#endif + +#if HAVE_ERRNO_H +#include +#endif + +#if HAVE_LINUX_SOCKIOS_H +#include +#endif + +#if HAVE_PCAP_H +#include +#endif + +#if TIME_WITH_SYS_TIME +#include +#include +#else +#if HAVE_SYS_TIME_H +#include +#else +#include +#endif +#endif diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/config.cache b/target/linux/etrax-2.6/image/e100boot/src/sbl/config.cache new file mode 100644 index 0000000000..a5c0e9cf7e --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/config.cache @@ -0,0 +1,48 @@ +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +ac_cv_header_arpa_inet_h=${ac_cv_header_arpa_inet_h=yes} +ac_cv_header_ctype_h=${ac_cv_header_ctype_h=yes} +ac_cv_header_errno_h=${ac_cv_header_errno_h=yes} +ac_cv_header_fcntl_h=${ac_cv_header_fcntl_h=yes} +ac_cv_header_linux_if_ether_h=${ac_cv_header_linux_if_ether_h=yes} +ac_cv_header_linux_sockios_h=${ac_cv_header_linux_sockios_h=yes} +ac_cv_header_net_if_h=${ac_cv_header_net_if_h=yes} +ac_cv_header_netdb_h=${ac_cv_header_netdb_h=yes} +ac_cv_header_netinet_in_h=${ac_cv_header_netinet_in_h=yes} +ac_cv_header_netinet_in_systm_h=${ac_cv_header_netinet_in_systm_h=yes} +ac_cv_header_netinet_ip_h=${ac_cv_header_netinet_ip_h=yes} +ac_cv_header_netinet_tcp_h=${ac_cv_header_netinet_tcp_h=yes} +ac_cv_header_netinet_udp_h=${ac_cv_header_netinet_udp_h=yes} +ac_cv_header_pcap_pcap_h=${ac_cv_header_pcap_pcap_h=no} +ac_cv_header_signal_h=${ac_cv_header_signal_h=yes} +ac_cv_header_stdc=${ac_cv_header_stdc=yes} +ac_cv_header_stdio_h=${ac_cv_header_stdio_h=yes} +ac_cv_header_stdlib_h=${ac_cv_header_stdlib_h=yes} +ac_cv_header_string_h=${ac_cv_header_string_h=yes} +ac_cv_header_sys_ioctl_h=${ac_cv_header_sys_ioctl_h=yes} +ac_cv_header_sys_socket_h=${ac_cv_header_sys_socket_h=yes} +ac_cv_header_sys_stat_h=${ac_cv_header_sys_stat_h=yes} +ac_cv_header_sys_time_h=${ac_cv_header_sys_time_h=yes} +ac_cv_header_sys_types_h=${ac_cv_header_sys_types_h=yes} +ac_cv_header_termios_h=${ac_cv_header_termios_h=yes} +ac_cv_header_time=${ac_cv_header_time=yes} +ac_cv_header_unistd_h=${ac_cv_header_unistd_h=yes} +ac_cv_lib_pcap_pcap_open_live=${ac_cv_lib_pcap_pcap_open_live=no} +ac_cv_prog_CC=${ac_cv_prog_CC=gcc} +ac_cv_prog_CPP=${ac_cv_prog_CPP='gcc -E'} +ac_cv_prog_cc_cross=${ac_cv_prog_cc_cross=no} +ac_cv_prog_cc_g=${ac_cv_prog_cc_g=yes} +ac_cv_prog_cc_works=${ac_cv_prog_cc_works=yes} +ac_cv_prog_gcc=${ac_cv_prog_gcc=yes} diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/config.log b/target/linux/etrax-2.6/image/e100boot/src/sbl/config.log new file mode 100644 index 0000000000..43de9c5da0 --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/config.log @@ -0,0 +1,90 @@ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +configure:530: checking for gcc +configure:643: checking whether the C compiler (gcc ) works +configure:659: gcc -o conftest conftest.c 1>&5 +configure:685: checking whether the C compiler (gcc ) is a cross-compiler +configure:690: checking whether we are using GNU C +configure:699: gcc -E conftest.c +configure:718: checking whether gcc accepts -g +configure:751: checking for pcap_open_live in -lpcap +configure:770: gcc -o conftest -g -O2 conftest.c -lpcap 1>&5 +/usr/bin/ld: cannot find -lpcap +collect2: ld returned 1 exit status +configure: failed program was: +#line 759 "configure" +#include "confdefs.h" +/* Override any gcc2 internal prototype to avoid an error. */ +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char pcap_open_live(); + +int main() { +pcap_open_live() +; return 0; } +configure:799: checking how to run the C preprocessor +configure:820: gcc -E conftest.c >/dev/null 2>conftest.out +configure:879: checking for ANSI C header files +configure:892: gcc -E conftest.c >/dev/null 2>conftest.out +configure:959: gcc -o conftest -g -O2 conftest.c 1>&5 +configure: In function 'main': +configure:954: warning: incompatible implicit declaration of built-in function 'exit' +configure:986: checking for termios.h +configure:996: gcc -E conftest.c >/dev/null 2>conftest.out +configure:986: checking for sys/ioctl.h +configure:996: gcc -E conftest.c >/dev/null 2>conftest.out +configure:986: checking for net/if.h +configure:996: gcc -E conftest.c >/dev/null 2>conftest.out +configure:986: checking for netinet/in.h +configure:996: gcc -E conftest.c >/dev/null 2>conftest.out +configure:986: checking for netinet/in_systm.h +configure:996: gcc -E conftest.c >/dev/null 2>conftest.out +configure:986: checking for netinet/ip.h +configure:996: gcc -E conftest.c >/dev/null 2>conftest.out +configure:986: checking for netinet/udp.h +configure:996: gcc -E conftest.c >/dev/null 2>conftest.out +configure:986: checking for netinet/tcp.h +configure:996: gcc -E conftest.c >/dev/null 2>conftest.out +configure:986: checking for netdb.h +configure:996: gcc -E conftest.c >/dev/null 2>conftest.out +configure:986: checking for arpa/inet.h +configure:996: gcc -E conftest.c >/dev/null 2>conftest.out +configure:986: checking for sys/socket.h +configure:996: gcc -E conftest.c >/dev/null 2>conftest.out +configure:986: checking for fcntl.h +configure:996: gcc -E conftest.c >/dev/null 2>conftest.out +configure:986: checking for linux/if_ether.h +configure:996: gcc -E conftest.c >/dev/null 2>conftest.out +configure:986: checking for signal.h +configure:996: gcc -E conftest.c >/dev/null 2>conftest.out +configure:986: checking for string.h +configure:996: gcc -E conftest.c >/dev/null 2>conftest.out +configure:986: checking for stdlib.h +configure:996: gcc -E conftest.c >/dev/null 2>conftest.out +configure:986: checking for stdio.h +configure:996: gcc -E conftest.c >/dev/null 2>conftest.out +configure:986: checking for sys/time.h +configure:996: gcc -E conftest.c >/dev/null 2>conftest.out +configure:986: checking for unistd.h +configure:996: gcc -E conftest.c >/dev/null 2>conftest.out +configure:986: checking for sys/stat.h +configure:996: gcc -E conftest.c >/dev/null 2>conftest.out +configure:986: checking for sys/types.h +configure:996: gcc -E conftest.c >/dev/null 2>conftest.out +configure:986: checking for errno.h +configure:996: gcc -E conftest.c >/dev/null 2>conftest.out +configure:986: checking for linux/sockios.h +configure:996: gcc -E conftest.c >/dev/null 2>conftest.out +configure:986: checking for ctype.h +configure:996: gcc -E conftest.c >/dev/null 2>conftest.out +configure:986: checking for sys/socket.h +configure:986: checking for pcap/pcap.h +configure:996: gcc -E conftest.c >/dev/null 2>conftest.out +configure:992:23: error: pcap/pcap.h: No such file or directory +configure: failed program was: +#line 991 "configure" +#include "confdefs.h" +#include +configure:1024: checking whether time.h and sys/time.h may both be included +configure:1038: gcc -c -g -O2 conftest.c 1>&5 diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/config.status b/target/linux/etrax-2.6/image/e100boot/src/sbl/config.status new file mode 100755 index 0000000000..3580ac7170 --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/config.status @@ -0,0 +1,330 @@ +#! /bin/sh +# Generated automatically by configure. +# Run this file to recreate the current configuration. +# This directory was configured as follows, +# on host bertha: +# +# ./configure +# +# Compiler output produced by configure, useful for debugging +# configure, is in ./config.log if it exists. + +ac_cs_usage="Usage: ./config.status [--recheck] [--version] [--help]" +for ac_option +do + case "$ac_option" in + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running ${CONFIG_SHELL-/bin/sh} ./configure --no-create --no-recursion" + exec ${CONFIG_SHELL-/bin/sh} ./configure --no-create --no-recursion ;; + -version | --version | --versio | --versi | --vers | --ver | --ve | --v) + echo "./config.status generated by autoconf version 2.13" + exit 0 ;; + -help | --help | --hel | --he | --h) + echo "$ac_cs_usage"; exit 0 ;; + *) echo "$ac_cs_usage"; exit 1 ;; + esac +done + +ac_given_srcdir=. + +trap 'rm -fr Makefile conf.h conftest*; exit 1' 1 2 15 + +# Protect against being on the right side of a sed subst in config.status. +sed 's/%@/@@/; s/@%/@@/; s/%g$/@g/; /@g$/s/[\\&%]/\\&/g; + s/@@/%@/; s/@@/@%/; s/@g$/%g/' > conftest.subs <<\CEOF +/^[ ]*VPATH[ ]*=[^:]*$/d + +s%@SHELL@%/bin/sh%g +s%@CFLAGS@%-g -O2%g +s%@CPPFLAGS@%%g +s%@CXXFLAGS@%%g +s%@FFLAGS@%%g +s%@DEFS@%-DHAVE_CONFIG_H%g +s%@LDFLAGS@%%g +s%@LIBS@%%g +s%@exec_prefix@%${prefix}%g +s%@prefix@%/usr/local%g +s%@program_transform_name@%s,x,x,%g +s%@bindir@%${exec_prefix}/bin%g +s%@sbindir@%${exec_prefix}/sbin%g +s%@libexecdir@%${exec_prefix}/libexec%g +s%@datadir@%${prefix}/share%g +s%@sysconfdir@%${prefix}/etc%g +s%@sharedstatedir@%${prefix}/com%g +s%@localstatedir@%${prefix}/var%g +s%@libdir@%${exec_prefix}/lib%g +s%@includedir@%${prefix}/include%g +s%@oldincludedir@%/usr/include%g +s%@infodir@%${prefix}/info%g +s%@mandir@%${prefix}/man%g +s%@CC@%gcc%g +s%@CPP@%gcc -E%g + +CEOF + +# Split the substitutions into bite-sized pieces for seds with +# small command number limits, like on Digital OSF/1 and HP-UX. +ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. +ac_file=1 # Number of current file. +ac_beg=1 # First line for current file. +ac_end=$ac_max_sed_cmds # Line after last line for current file. +ac_more_lines=: +ac_sed_cmds="" +while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file + else + sed "${ac_end}q" conftest.subs > conftest.s$ac_file + fi + if test ! -s conftest.s$ac_file; then + ac_more_lines=false + rm -f conftest.s$ac_file + else + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f conftest.s$ac_file" + else + ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" + fi + ac_file=`expr $ac_file + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_cmds` + fi +done +if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat +fi + +CONFIG_FILES=${CONFIG_FILES-"Makefile"} +for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. + + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` + else + ac_dir_suffix= ac_dots= + fi + + case "$ac_given_srcdir" in + .) srcdir=. + if test -z "$ac_dots"; then top_srcdir=. + else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; + /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; + *) # Relative path. + srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" + top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + + echo creating "$ac_file" + rm -f "$ac_file" + configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." + case "$ac_file" in + *Makefile*) ac_comsub="1i\\ +# $configure_input" ;; + *) ac_comsub= ;; + esac + + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + sed -e "$ac_comsub +s%@configure_input@%$configure_input%g +s%@srcdir@%$srcdir%g +s%@top_srcdir@%$top_srcdir%g +" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file +fi; done +rm -f conftest.s* + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' +ac_dC='\3' +ac_dD='%g' +# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". +ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='\([ ]\)%\1#\2define\3' +ac_uC=' ' +ac_uD='\4%g' +# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_eB='$%\1#\2define\3' +ac_eC=' ' +ac_eD='%g' + +if test "${CONFIG_HEADERS+set}" != set; then + CONFIG_HEADERS="conf.h" +fi +for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + echo creating $ac_file + + rm -f conftest.frag conftest.in conftest.out + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + cat $ac_file_inputs > conftest.in + + cat > conftest.frag < conftest.out + rm -f conftest.in + mv conftest.out conftest.in + + cat > conftest.frag < conftest.out + rm -f conftest.in + mv conftest.out conftest.in + + cat > conftest.frag < conftest.out + rm -f conftest.in + mv conftest.out conftest.in + + cat > conftest.frag < conftest.out + rm -f conftest.in + mv conftest.out conftest.in + + cat > conftest.frag < conftest.out + rm -f conftest.in + mv conftest.out conftest.in + + cat > conftest.frag < conftest.out + rm -f conftest.in + mv conftest.out conftest.in + + cat > conftest.frag < conftest.out + rm -f conftest.in + mv conftest.out conftest.in + + rm -f conftest.frag conftest.h + echo "/* $ac_file. Generated automatically by configure. */" > conftest.h + cat conftest.in >> conftest.h + rm -f conftest.in + if cmp -s $ac_file conftest.h 2>/dev/null; then + echo "$ac_file is unchanged" + rm -f conftest.h + else + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + fi + rm -f $ac_file + mv conftest.h $ac_file + fi +fi; done + + + +exit 0 diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/configure b/target/linux/etrax-2.6/image/e100boot/src/sbl/configure new file mode 100755 index 0000000000..16b8bf52fe --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/configure @@ -0,0 +1,1405 @@ +#! /bin/sh + +# Guess values for system-dependent variables and create Makefiles. +# Generated automatically using autoconf version 2.13 +# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. +# +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. + +# Defaults: +ac_help= +ac_default_prefix=/usr/local +# Any additions from configure.in: + +# Initialize some variables set by options. +# The variables have the same names as the options, with +# dashes changed to underlines. +build=NONE +cache_file=./config.cache +exec_prefix=NONE +host=NONE +no_create= +nonopt=NONE +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +target=NONE +verbose= +x_includes=NONE +x_libraries=NONE +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +# Initialize some other variables. +subdirs= +MFLAGS= MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} +# Maximum number of lines to put in a shell here document. +ac_max_here_lines=12 + +ac_prev= +for ac_option +do + + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + case "$ac_option" in + -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) ac_optarg= ;; + esac + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case "$ac_option" in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir="$ac_optarg" ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build="$ac_optarg" ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file="$ac_optarg" ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir="$ac_optarg" ;; + + -disable-* | --disable-*) + ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + eval "enable_${ac_feature}=no" ;; + + -enable-* | --enable-*) + ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } + fi + ac_feature=`echo $ac_feature| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "enable_${ac_feature}='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix="$ac_optarg" ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he) + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat << EOF +Usage: configure [options] [host] +Options: [defaults in brackets after descriptions] +Configuration: + --cache-file=FILE cache test results in FILE + --help print this message + --no-create do not create output files + --quiet, --silent do not print \`checking...' messages + --version print the version of autoconf that created configure +Directory and file names: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [same as prefix] + --bindir=DIR user executables in DIR [EPREFIX/bin] + --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] + --libexecdir=DIR program executables in DIR [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data in DIR + [PREFIX/share] + --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data in DIR + [PREFIX/com] + --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] + --libdir=DIR object code libraries in DIR [EPREFIX/lib] + --includedir=DIR C header files in DIR [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] + --infodir=DIR info documentation in DIR [PREFIX/info] + --mandir=DIR man documentation in DIR [PREFIX/man] + --srcdir=DIR find the sources in DIR [configure dir or ..] + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM + run sed PROGRAM on installed program names +EOF + cat << EOF +Host type: + --build=BUILD configure for building on BUILD [BUILD=HOST] + --host=HOST configure for HOST [guessed] + --target=TARGET configure for TARGET [TARGET=HOST] +Features and packages: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --x-includes=DIR X include files are in DIR + --x-libraries=DIR X library files are in DIR +EOF + if test -n "$ac_help"; then + echo "--enable and --with options recognized:$ac_help" + fi + exit 0 ;; + + -host | --host | --hos | --ho) + ac_prev=host ;; + -host=* | --host=* | --hos=* | --ho=*) + host="$ac_optarg" ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir="$ac_optarg" ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir="$ac_optarg" ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir="$ac_optarg" ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir="$ac_optarg" ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir="$ac_optarg" ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir="$ac_optarg" ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir="$ac_optarg" ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix="$ac_optarg" ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix="$ac_optarg" ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix="$ac_optarg" ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name="$ac_optarg" ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir="$ac_optarg" ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir="$ac_optarg" ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site="$ac_optarg" ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir="$ac_optarg" ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir="$ac_optarg" ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target="$ac_optarg" ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers) + echo "configure generated by autoconf version 2.13" + exit 0 ;; + + -with-* | --with-*) + ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + case "$ac_option" in + *=*) ;; + *) ac_optarg=yes ;; + esac + eval "with_${ac_package}='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`echo $ac_option|sed -e 's/-*without-//'` + # Reject names that are not valid shell variable names. + if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then + { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } + fi + ac_package=`echo $ac_package| sed 's/-/_/g'` + eval "with_${ac_package}=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes="$ac_optarg" ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries="$ac_optarg" ;; + + -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } + ;; + + *) + if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then + echo "configure: warning: $ac_option: invalid host type" 1>&2 + fi + if test "x$nonopt" != xNONE; then + { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } + fi + nonopt="$ac_option" + ;; + + esac +done + +if test -n "$ac_prev"; then + { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } +fi + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +# File descriptor usage: +# 0 standard input +# 1 file creation +# 2 errors and warnings +# 3 some systems may open it to /dev/tty +# 4 used on the Kubota Titan +# 6 checking for... messages and results +# 5 compiler messages saved in config.log +if test "$silent" = yes; then + exec 6>/dev/null +else + exec 6>&1 +fi +exec 5>./config.log + +echo "\ +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. +" 1>&5 + +# Strip out --no-create and --no-recursion so they do not pile up. +# Also quote any args containing shell metacharacters. +ac_configure_args= +for ac_arg +do + case "$ac_arg" in + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c) ;; + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) + ac_configure_args="$ac_configure_args '$ac_arg'" ;; + *) ac_configure_args="$ac_configure_args $ac_arg" ;; + esac +done + +# NLS nuisances. +# Only set these to C if already set. These must not be set unconditionally +# because not all systems understand e.g. LANG=C (notably SCO). +# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! +# Non-C LC_CTYPE values break the ctype check. +if test "${LANG+set}" = set; then LANG=C; export LANG; fi +if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi +if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi +if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo > confdefs.h + +# A filename unique to this package, relative to the directory that +# configure is in, which we can look for to find out if srcdir is correct. +ac_unique_file=common.c + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_prog=$0 + ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` + test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } + else + { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } + fi +fi +srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` + +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + echo "loading site script $ac_site_file" + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + echo "loading cache $cache_file" + . $cache_file +else + echo "creating cache $cache_file" + > $cache_file +fi + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +ac_exeext= +ac_objext=o +if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then + # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. + if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then + ac_n= ac_c=' +' ac_t=' ' + else + ac_n=-n ac_c= ac_t= + fi +else + ac_n= ac_c='\c' ac_t= +fi + + + + +# Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:530: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="gcc" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:560: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_prog_rejected=no + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + break + fi + done + IFS="$ac_save_ifs" +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# -gt 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + set dummy "$ac_dir/$ac_word" "$@" + shift + ac_cv_prog_CC="$@" + fi +fi +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + + if test -z "$CC"; then + case "`uname -s`" in + *win32* | *WIN32*) + # Extract the first word of "cl", so it can be a program name with args. +set dummy cl; ac_word=$2 +echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 +echo "configure:611: checking for $ac_word" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" + ac_dummy="$PATH" + for ac_dir in $ac_dummy; do + test -z "$ac_dir" && ac_dir=. + if test -f $ac_dir/$ac_word; then + ac_cv_prog_CC="cl" + break + fi + done + IFS="$ac_save_ifs" +fi +fi +CC="$ac_cv_prog_CC" +if test -n "$CC"; then + echo "$ac_t""$CC" 1>&6 +else + echo "$ac_t""no" 1>&6 +fi + ;; + esac + fi + test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } +fi + +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 +echo "configure:643: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 + +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +cat > conftest.$ac_ext << EOF + +#line 654 "configure" +#include "confdefs.h" + +main(){return(0);} +EOF +if { (eval echo configure:659: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + ac_cv_prog_cc_works=yes + # If we can't run a trivial program, we are probably using a cross compiler. + if (./conftest; exit) 2>/dev/null; then + ac_cv_prog_cc_cross=no + else + ac_cv_prog_cc_cross=yes + fi +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + ac_cv_prog_cc_works=no +fi +rm -fr conftest* +ac_ext=c +# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. +ac_cpp='$CPP $CPPFLAGS' +ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' +ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' +cross_compiling=$ac_cv_prog_cc_cross + +echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 +if test $ac_cv_prog_cc_works = no; then + { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } +fi +echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 +echo "configure:685: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 +echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 +cross_compiling=$ac_cv_prog_cc_cross + +echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 +echo "configure:690: checking whether we are using GNU C" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.c <&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then + ac_cv_prog_gcc=yes +else + ac_cv_prog_gcc=no +fi +fi + +echo "$ac_t""$ac_cv_prog_gcc" 1>&6 + +if test $ac_cv_prog_gcc = yes; then + GCC=yes +else + GCC= +fi + +ac_test_CFLAGS="${CFLAGS+set}" +ac_save_CFLAGS="$CFLAGS" +CFLAGS= +echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 +echo "configure:718: checking whether ${CC-cc} accepts -g" >&5 +if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + echo 'void f(){}' > conftest.c +if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then + ac_cv_prog_cc_g=yes +else + ac_cv_prog_cc_g=no +fi +rm -f conftest* + +fi + +echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS="$ac_save_CFLAGS" +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi + + +echo $ac_n "checking for pcap_open_live in -lpcap""... $ac_c" 1>&6 +echo "configure:751: checking for pcap_open_live in -lpcap" >&5 +ac_lib_var=`echo pcap'_'pcap_open_live | sed 'y%./+-%__p_%'` +if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + ac_save_LIBS="$LIBS" +LIBS="-lpcap $LIBS" +cat > conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=yes" +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_lib_$ac_lib_var=no" +fi +rm -f conftest* +LIBS="$ac_save_LIBS" + +fi +if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_lib=HAVE_LIB`echo pcap | sed -e 's/[^a-zA-Z0-9_]/_/g' \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'` + cat >> confdefs.h <&6 +fi + + +echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 +echo "configure:799: checking how to run the C preprocessor" >&5 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then +if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + # This must be in double quotes, not single quotes, because CPP may get + # substituted into the Makefile and "${CC-cc}" will confuse make. + CPP="${CC-cc} -E" + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:820: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -E -traditional-cpp" + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:837: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP="${CC-cc} -nologo -E" + cat > conftest.$ac_ext < +Syntax Error +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:854: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + : +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + CPP=/lib/cpp +fi +rm -f conftest* +fi +rm -f conftest* +fi +rm -f conftest* + ac_cv_prog_CPP="$CPP" +fi + CPP="$ac_cv_prog_CPP" +else + ac_cv_prog_CPP="$CPP" +fi +echo "$ac_t""$CPP" 1>&6 + +echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 +echo "configure:879: checking for ANSI C header files" >&5 +if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +#include +#include +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:892: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + ac_cv_header_stdc=yes +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. +cat > conftest.$ac_ext < +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "memchr" >/dev/null 2>&1; then + : +else + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. +cat > conftest.$ac_ext < +EOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + egrep "free" >/dev/null 2>&1; then + : +else + rm -rf conftest* + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. +if test "$cross_compiling" = yes; then + : +else + cat > conftest.$ac_ext < +#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int main () { int i; for (i = 0; i < 256; i++) +if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); +exit (0); } + +EOF +if { (eval echo configure:959: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null +then + : +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -fr conftest* + ac_cv_header_stdc=no +fi +rm -fr conftest* +fi + +fi +fi + +echo "$ac_t""$ac_cv_header_stdc" 1>&6 +if test $ac_cv_header_stdc = yes; then + cat >> confdefs.h <<\EOF +#define STDC_HEADERS 1 +EOF + +fi + +for ac_hdr in termios.h sys/ioctl.h net/if.h netinet/in.h netinet/in_systm.h netinet/ip.h netinet/udp.h netinet/tcp.h netdb.h arpa/inet.h sys/socket.h fcntl.h linux/if_ether.h signal.h string.h stdlib.h stdio.h sys/time.h unistd.h sys/stat.h sys/types.h errno.h linux/sockios.h ctype.h sys/socket.h pcap/pcap.h +do +ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` +echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 +echo "configure:986: checking for $ac_hdr" >&5 +if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +EOF +ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" +{ (eval echo configure:996: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` +if test -z "$ac_err"; then + rm -rf conftest* + eval "ac_cv_header_$ac_safe=yes" +else + echo "$ac_err" >&5 + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + eval "ac_cv_header_$ac_safe=no" +fi +rm -f conftest* +fi +if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then + echo "$ac_t""yes" 1>&6 + ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` + cat >> confdefs.h <&6 +fi +done + + +echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6 +echo "configure:1024: checking whether time.h and sys/time.h may both be included" >&5 +if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then + echo $ac_n "(cached) $ac_c" 1>&6 +else + cat > conftest.$ac_ext < +#include +#include +int main() { +struct tm *tp; +; return 0; } +EOF +if { (eval echo configure:1038: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then + rm -rf conftest* + ac_cv_header_time=yes +else + echo "configure: failed program was:" >&5 + cat conftest.$ac_ext >&5 + rm -rf conftest* + ac_cv_header_time=no +fi +rm -f conftest* +fi + +echo "$ac_t""$ac_cv_header_time" 1>&6 +if test $ac_cv_header_time = yes; then + cat >> confdefs.h <<\EOF +#define TIME_WITH_SYS_TIME 1 +EOF + +fi + + +trap '' 1 2 15 +cat > confcache <<\EOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs. It is not useful on other systems. +# If it contains results you don't want to keep, you may remove or edit it. +# +# By default, configure uses ./config.cache as the cache file, +# creating it if it does not exist already. You can give configure +# the --cache-file=FILE option to use a different cache file; that is +# what configure does when it calls configure scripts in +# subdirectories, so they share the cache. +# Giving --cache-file=/dev/null disables caching, for debugging configure. +# config.status only pays attention to the cache file if you give it the +# --recheck option to rerun configure. +# +EOF +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +(set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote substitution + # turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + -e "s/'/'\\\\''/g" \ + -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' + ;; + esac >> confcache +if cmp -s $cache_file confcache; then + : +else + if test -w $cache_file; then + echo "updating cache $cache_file" + cat confcache > $cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# Any assignment to VPATH causes Sun make to only execute +# the first set of double-colon rules, so remove it if not needed. +# If there is a colon in the path, we need to keep it. +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' +fi + +trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 + +DEFS=-DHAVE_CONFIG_H + +# Without the "./", some shells look in PATH for config.status. +: ${CONFIG_STATUS=./config.status} + +echo creating $CONFIG_STATUS +rm -f $CONFIG_STATUS +cat > $CONFIG_STATUS </dev/null | sed 1q`: +# +# $0 $ac_configure_args +# +# Compiler output produced by configure, useful for debugging +# configure, is in ./config.log if it exists. + +ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" +for ac_option +do + case "\$ac_option" in + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" + exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; + -version | --version | --versio | --versi | --vers | --ver | --ve | --v) + echo "$CONFIG_STATUS generated by autoconf version 2.13" + exit 0 ;; + -help | --help | --hel | --he | --h) + echo "\$ac_cs_usage"; exit 0 ;; + *) echo "\$ac_cs_usage"; exit 1 ;; + esac +done + +ac_given_srcdir=$srcdir + +trap 'rm -fr `echo "Makefile conf.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 +EOF +cat >> $CONFIG_STATUS < conftest.subs <<\\CEOF +$ac_vpsub +$extrasub +s%@SHELL@%$SHELL%g +s%@CFLAGS@%$CFLAGS%g +s%@CPPFLAGS@%$CPPFLAGS%g +s%@CXXFLAGS@%$CXXFLAGS%g +s%@FFLAGS@%$FFLAGS%g +s%@DEFS@%$DEFS%g +s%@LDFLAGS@%$LDFLAGS%g +s%@LIBS@%$LIBS%g +s%@exec_prefix@%$exec_prefix%g +s%@prefix@%$prefix%g +s%@program_transform_name@%$program_transform_name%g +s%@bindir@%$bindir%g +s%@sbindir@%$sbindir%g +s%@libexecdir@%$libexecdir%g +s%@datadir@%$datadir%g +s%@sysconfdir@%$sysconfdir%g +s%@sharedstatedir@%$sharedstatedir%g +s%@localstatedir@%$localstatedir%g +s%@libdir@%$libdir%g +s%@includedir@%$includedir%g +s%@oldincludedir@%$oldincludedir%g +s%@infodir@%$infodir%g +s%@mandir@%$mandir%g +s%@CC@%$CC%g +s%@CPP@%$CPP%g + +CEOF +EOF + +cat >> $CONFIG_STATUS <<\EOF + +# Split the substitutions into bite-sized pieces for seds with +# small command number limits, like on Digital OSF/1 and HP-UX. +ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. +ac_file=1 # Number of current file. +ac_beg=1 # First line for current file. +ac_end=$ac_max_sed_cmds # Line after last line for current file. +ac_more_lines=: +ac_sed_cmds="" +while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file + else + sed "${ac_end}q" conftest.subs > conftest.s$ac_file + fi + if test ! -s conftest.s$ac_file; then + ac_more_lines=false + rm -f conftest.s$ac_file + else + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f conftest.s$ac_file" + else + ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" + fi + ac_file=`expr $ac_file + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_cmds` + fi +done +if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat +fi +EOF + +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. + + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" + # A "../" for each directory in $ac_dir_suffix. + ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` + else + ac_dir_suffix= ac_dots= + fi + + case "$ac_given_srcdir" in + .) srcdir=. + if test -z "$ac_dots"; then top_srcdir=. + else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; + /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; + *) # Relative path. + srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" + top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + + echo creating "$ac_file" + rm -f "$ac_file" + configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." + case "$ac_file" in + *Makefile*) ac_comsub="1i\\ +# $configure_input" ;; + *) ac_comsub= ;; + esac + + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + sed -e "$ac_comsub +s%@configure_input@%$configure_input%g +s%@srcdir@%$srcdir%g +s%@top_srcdir@%$top_srcdir%g +" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file +fi; done +rm -f conftest.s* + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' +ac_dC='\3' +ac_dD='%g' +# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". +ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='\([ ]\)%\1#\2define\3' +ac_uC=' ' +ac_uD='\4%g' +# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_eB='$%\1#\2define\3' +ac_eC=' ' +ac_eD='%g' + +if test "${CONFIG_HEADERS+set}" != set; then +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF +fi +for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case "$ac_file" in + *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` + ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + *) ac_file_in="${ac_file}.in" ;; + esac + + echo creating $ac_file + + rm -f conftest.frag conftest.in conftest.out + ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` + cat $ac_file_inputs > conftest.in + +EOF + +# Transform confdefs.h into a sed script conftest.vals that substitutes +# the proper values into config.h.in to produce config.h. And first: +# Protect against being on the right side of a sed subst in config.status. +# Protect against being in an unquoted here document in config.status. +rm -f conftest.vals +cat > conftest.hdr <<\EOF +s/[\\&%]/\\&/g +s%[\\$`]%\\&%g +s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp +s%ac_d%ac_u%gp +s%ac_u%ac_e%gp +EOF +sed -n -f conftest.hdr confdefs.h > conftest.vals +rm -f conftest.hdr + +# This sed command replaces #undef with comments. This is necessary, for +# example, in the case of _POSIX_SOURCE, which is predefined and required +# on some systems where configure will not decide to define it. +cat >> conftest.vals <<\EOF +s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% +EOF + +# Break up conftest.vals because some shells have a limit on +# the size of here documents, and old seds have small limits too. + +rm -f conftest.tail +while : +do + ac_lines=`grep -c . conftest.vals` + # grep -c gives empty output for an empty file on some AIX systems. + if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi + # Write a limited-size here document to conftest.frag. + echo ' cat > conftest.frag <> $CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS + echo 'CEOF + sed -f conftest.frag conftest.in > conftest.out + rm -f conftest.in + mv conftest.out conftest.in +' >> $CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail + rm -f conftest.vals + mv conftest.tail conftest.vals +done +rm -f conftest.vals + +cat >> $CONFIG_STATUS <<\EOF + rm -f conftest.frag conftest.h + echo "/* $ac_file. Generated automatically by configure. */" > conftest.h + cat conftest.in >> conftest.h + rm -f conftest.in + if cmp -s $ac_file conftest.h 2>/dev/null; then + echo "$ac_file is unchanged" + rm -f conftest.h + else + # Remove last slash and all that follows it. Not all systems have dirname. + ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` + if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then + # The file is in a subdirectory. + test ! -d "$ac_dir" && mkdir "$ac_dir" + fi + rm -f $ac_file + mv conftest.h $ac_file + fi +fi; done + +EOF +cat >> $CONFIG_STATUS <> $CONFIG_STATUS <<\EOF + +exit 0 +EOF +chmod +x $CONFIG_STATUS +rm -fr confdefs* $ac_clean_files +test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 + diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/configure.in b/target/linux/etrax-2.6/image/e100boot/src/sbl/configure.in new file mode 100644 index 0000000000..24e161c50d --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/configure.in @@ -0,0 +1,19 @@ +dnl Process this file with autoconf to produce a configure script. +AC_INIT(common.c) +AC_CONFIG_HEADER(conf.h) + +dnl Checks for programs. +AC_PROG_CC + +dnl Checks for libraries. +AC_CHECK_LIB(pcap, pcap_open_live) + +dnl Checks for header files. +AC_HEADER_STDC +AC_CHECK_HEADERS(termios.h sys/ioctl.h net/if.h netinet/in.h netinet/in_systm.h netinet/ip.h netinet/udp.h netinet/tcp.h netdb.h arpa/inet.h sys/socket.h fcntl.h linux/if_ether.h signal.h string.h stdlib.h stdio.h sys/time.h unistd.h sys/stat.h sys/types.h errno.h linux/sockios.h ctype.h sys/socket.h pcap/pcap.h) + +dnl Check for typedefs, structures, and compiler characteristics. +AC_HEADER_TIME + +dnl Checks for library functions. +AC_OUTPUT(Makefile) diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/create_regs.pl b/target/linux/etrax-2.6/image/e100boot/src/sbl/create_regs.pl new file mode 100755 index 0000000000..5127538b78 --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/create_regs.pl @@ -0,0 +1,14 @@ +#!/usr/bin/perl + +print "struct reg_des { + char *name; + unsigned int addr; +} reg_des[] = {\n"; +while(<>) { + if (/define+ (\w+) .*IO_TYPECAST+.*DWORD.*\s+(\w+)/) { + print " \"$1\", $2,\n"; + } +} + print " NULL, 0 +}; +"; diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/deps/common.d b/target/linux/etrax-2.6/image/e100boot/src/sbl/deps/common.d new file mode 100644 index 0000000000..81d54c683a --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/deps/common.d @@ -0,0 +1,58 @@ +common.o: common.c /usr/include/byteswap.h /usr/include/bits/byteswap.h \ + conf.h /usr/include/termios.h /usr/include/features.h \ + /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \ + /usr/include/bits/termios.h /usr/include/sys/ttydefaults.h \ + /usr/include/sys/ioctl.h /usr/include/bits/ioctls.h \ + /usr/include/asm/ioctls.h /usr/include/asm-i486/ioctls.h \ + /usr/include/asm/ioctl.h /usr/include/asm-i486/ioctl.h \ + /usr/include/asm-generic/ioctl.h /usr/include/bits/ioctl-types.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/wordsize.h \ + /usr/lib/gcc/i486-linux-gnu/4.1.2/include/stddef.h \ + /usr/include/bits/typesizes.h /usr/include/time.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/sigset.h \ + /usr/include/bits/time.h /usr/include/sys/sysmacros.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h \ + /usr/include/ctype.h /usr/include/sys/socket.h /usr/include/sys/uio.h \ + /usr/include/bits/uio.h /usr/include/bits/socket.h \ + /usr/lib/gcc/i486-linux-gnu/4.1.2/include/limits.h \ + /usr/lib/gcc/i486-linux-gnu/4.1.2/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/sockaddr.h \ + /usr/include/asm/socket.h /usr/include/asm-i486/socket.h \ + /usr/include/asm/sockios.h /usr/include/asm-i486/sockios.h \ + /usr/include/netinet/in.h /usr/include/stdint.h \ + /usr/include/bits/wchar.h /usr/include/bits/in.h /usr/include/net/if.h \ + /usr/include/netinet/in_systm.h /usr/include/netinet/ip.h \ + /usr/include/netinet/udp.h /usr/include/netinet/tcp.h \ + /usr/include/netdb.h /usr/include/rpc/netdb.h /usr/include/bits/netdb.h \ + /usr/include/arpa/inet.h /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/linux/if_ether.h /usr/include/linux/types.h \ + /usr/include/linux/posix_types.h /usr/include/linux/stddef.h \ + /usr/include/linux/compiler.h \ + /usr/lib/gcc/i486-linux-gnu/4.1.2/include/asm/posix_types.h \ + /usr/include/asm/posix_types.h /usr/include/asm-i486/posix_types.h \ + /usr/include/asm/types.h /usr/include/asm-i486/types.h \ + /usr/include/signal.h /usr/include/bits/signum.h \ + /usr/include/bits/siginfo.h /usr/include/bits/sigaction.h \ + /usr/include/bits/sigcontext.h /usr/include/asm/sigcontext.h \ + /usr/include/asm-i486/sigcontext.h /usr/include/bits/sigstack.h \ + /usr/include/bits/sigthread.h /usr/include/string.h \ + /usr/include/bits/string.h /usr/include/bits/string2.h \ + /usr/include/stdlib.h /usr/include/alloca.h /usr/include/stdio.h \ + /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \ + /usr/include/gconv.h /usr/lib/gcc/i486-linux-gnu/4.1.2/include/stdarg.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ + /usr/include/bits/stdio.h /usr/include/unistd.h \ + /usr/include/bits/posix_opt.h /usr/include/bits/confname.h \ + /usr/include/getopt.h /usr/include/sys/stat.h /usr/include/bits/stat.h \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-i486/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/linux/sockios.h \ + /usr/include/sys/time.h ../cbl/src/e100boot.h ../cbl/src/compiler.h \ + ../libpcap-0.4/pcap.h ../libpcap-0.4/net/bpf.h boot_images.h reg_des.h \ + ../cbl/src/sv_addr_ag.h ../cbl/src/sv_addr.agh common.h serial.h \ + network.h diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/deps/network.d b/target/linux/etrax-2.6/image/e100boot/src/sbl/deps/network.d new file mode 100644 index 0000000000..c88ed6d6be --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/deps/network.d @@ -0,0 +1,56 @@ +network.o: network.c /usr/include/stdio.h /usr/include/features.h \ + /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \ + /usr/lib/gcc/i486-linux-gnu/4.1.2/include/stddef.h \ + /usr/include/bits/types.h /usr/include/bits/wordsize.h \ + /usr/include/bits/typesizes.h /usr/include/libio.h \ + /usr/include/_G_config.h /usr/include/wchar.h /usr/include/bits/wchar.h \ + /usr/include/gconv.h /usr/lib/gcc/i486-linux-gnu/4.1.2/include/stdarg.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ + /usr/include/bits/stdio.h ../libpcap-0.4/pcap.h \ + /usr/include/sys/types.h /usr/include/time.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/sigset.h \ + /usr/include/bits/time.h /usr/include/sys/sysmacros.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h \ + /usr/include/sys/time.h ../libpcap-0.4/net/bpf.h conf.h \ + /usr/include/termios.h /usr/include/bits/termios.h \ + /usr/include/sys/ttydefaults.h /usr/include/sys/ioctl.h \ + /usr/include/bits/ioctls.h /usr/include/asm/ioctls.h \ + /usr/include/asm-i486/ioctls.h /usr/include/asm/ioctl.h \ + /usr/include/asm-i486/ioctl.h /usr/include/asm-generic/ioctl.h \ + /usr/include/bits/ioctl-types.h /usr/include/ctype.h \ + /usr/include/sys/socket.h /usr/include/sys/uio.h \ + /usr/include/bits/uio.h /usr/include/bits/socket.h \ + /usr/lib/gcc/i486-linux-gnu/4.1.2/include/limits.h \ + /usr/lib/gcc/i486-linux-gnu/4.1.2/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/sockaddr.h \ + /usr/include/asm/socket.h /usr/include/asm-i486/socket.h \ + /usr/include/asm/sockios.h /usr/include/asm-i486/sockios.h \ + /usr/include/netinet/in.h /usr/include/stdint.h /usr/include/bits/in.h \ + /usr/include/bits/byteswap.h /usr/include/net/if.h \ + /usr/include/netinet/in_systm.h /usr/include/netinet/ip.h \ + /usr/include/netinet/udp.h /usr/include/netinet/tcp.h \ + /usr/include/netdb.h /usr/include/rpc/netdb.h /usr/include/bits/netdb.h \ + /usr/include/arpa/inet.h /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/linux/if_ether.h /usr/include/linux/types.h \ + /usr/include/linux/posix_types.h /usr/include/linux/stddef.h \ + /usr/include/linux/compiler.h \ + /usr/lib/gcc/i486-linux-gnu/4.1.2/include/asm/posix_types.h \ + /usr/include/asm/posix_types.h /usr/include/asm-i486/posix_types.h \ + /usr/include/asm/types.h /usr/include/asm-i486/types.h \ + /usr/include/signal.h /usr/include/bits/signum.h \ + /usr/include/bits/siginfo.h /usr/include/bits/sigaction.h \ + /usr/include/bits/sigcontext.h /usr/include/asm/sigcontext.h \ + /usr/include/asm-i486/sigcontext.h /usr/include/bits/sigstack.h \ + /usr/include/bits/sigthread.h /usr/include/string.h \ + /usr/include/bits/string.h /usr/include/bits/string2.h \ + /usr/include/stdlib.h /usr/include/alloca.h /usr/include/unistd.h \ + /usr/include/bits/posix_opt.h /usr/include/bits/confname.h \ + /usr/include/getopt.h /usr/include/sys/stat.h /usr/include/bits/stat.h \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-i486/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/linux/sockios.h \ + ../cbl/src/e100boot.h ../cbl/src/compiler.h common.h network.h diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/deps/serial.d b/target/linux/etrax-2.6/image/e100boot/src/sbl/deps/serial.d new file mode 100644 index 0000000000..a680c03884 --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/deps/serial.d @@ -0,0 +1,56 @@ +serial.o: serial.c conf.h /usr/include/termios.h /usr/include/features.h \ + /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \ + /usr/include/bits/termios.h /usr/include/sys/ttydefaults.h \ + /usr/include/sys/ioctl.h /usr/include/bits/ioctls.h \ + /usr/include/asm/ioctls.h /usr/include/asm-i486/ioctls.h \ + /usr/include/asm/ioctl.h /usr/include/asm-i486/ioctl.h \ + /usr/include/asm-generic/ioctl.h /usr/include/bits/ioctl-types.h \ + /usr/include/sys/types.h /usr/include/bits/types.h \ + /usr/include/bits/wordsize.h \ + /usr/lib/gcc/i486-linux-gnu/4.1.2/include/stddef.h \ + /usr/include/bits/typesizes.h /usr/include/time.h /usr/include/endian.h \ + /usr/include/bits/endian.h /usr/include/sys/select.h \ + /usr/include/bits/select.h /usr/include/bits/sigset.h \ + /usr/include/bits/time.h /usr/include/sys/sysmacros.h \ + /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h \ + /usr/include/ctype.h /usr/include/sys/socket.h /usr/include/sys/uio.h \ + /usr/include/bits/uio.h /usr/include/bits/socket.h \ + /usr/lib/gcc/i486-linux-gnu/4.1.2/include/limits.h \ + /usr/lib/gcc/i486-linux-gnu/4.1.2/include/syslimits.h \ + /usr/include/limits.h /usr/include/bits/posix1_lim.h \ + /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ + /usr/include/bits/posix2_lim.h /usr/include/bits/sockaddr.h \ + /usr/include/asm/socket.h /usr/include/asm-i486/socket.h \ + /usr/include/asm/sockios.h /usr/include/asm-i486/sockios.h \ + /usr/include/netinet/in.h /usr/include/stdint.h \ + /usr/include/bits/wchar.h /usr/include/bits/in.h \ + /usr/include/bits/byteswap.h /usr/include/net/if.h \ + /usr/include/netinet/in_systm.h /usr/include/netinet/ip.h \ + /usr/include/netinet/udp.h /usr/include/netinet/tcp.h \ + /usr/include/netdb.h /usr/include/rpc/netdb.h /usr/include/bits/netdb.h \ + /usr/include/arpa/inet.h /usr/include/fcntl.h /usr/include/bits/fcntl.h \ + /usr/include/linux/if_ether.h /usr/include/linux/types.h \ + /usr/include/linux/posix_types.h /usr/include/linux/stddef.h \ + /usr/include/linux/compiler.h \ + /usr/lib/gcc/i486-linux-gnu/4.1.2/include/asm/posix_types.h \ + /usr/include/asm/posix_types.h /usr/include/asm-i486/posix_types.h \ + /usr/include/asm/types.h /usr/include/asm-i486/types.h \ + /usr/include/signal.h /usr/include/bits/signum.h \ + /usr/include/bits/siginfo.h /usr/include/bits/sigaction.h \ + /usr/include/bits/sigcontext.h /usr/include/asm/sigcontext.h \ + /usr/include/asm-i486/sigcontext.h /usr/include/bits/sigstack.h \ + /usr/include/bits/sigthread.h /usr/include/string.h \ + /usr/include/bits/string.h /usr/include/bits/string2.h \ + /usr/include/stdlib.h /usr/include/alloca.h /usr/include/stdio.h \ + /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \ + /usr/include/gconv.h /usr/lib/gcc/i486-linux-gnu/4.1.2/include/stdarg.h \ + /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h \ + /usr/include/bits/stdio.h /usr/include/unistd.h \ + /usr/include/bits/posix_opt.h /usr/include/bits/confname.h \ + /usr/include/getopt.h /usr/include/sys/stat.h /usr/include/bits/stat.h \ + /usr/include/errno.h /usr/include/bits/errno.h \ + /usr/include/linux/errno.h /usr/include/asm/errno.h \ + /usr/include/asm-i486/errno.h /usr/include/asm-generic/errno.h \ + /usr/include/asm-generic/errno-base.h /usr/include/linux/sockios.h \ + /usr/include/sys/time.h ../cbl/src/e100boot.h ../cbl/src/compiler.h \ + serial.h common.h diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/net_ima.c b/target/linux/etrax-2.6/image/e100boot/src/sbl/net_ima.c new file mode 100644 index 0000000000..749fe1ef82 --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/net_ima.c @@ -0,0 +1,891 @@ + +/* cconv 1.2 12/16/97, Copyright (C) 1997, Axis Communications AB */ + +const char net_ima[] = +{ + '\x0f', '\x05', '\x0f', '\x05', '\x6f', '\xee', '\x00', '\x1f', + '\x00', '\x38', '\x3f', '\x0d', '\x08', '\x01', '\x00', '\x38', + '\x78', '\x56', '\x34', '\x12', '\x21', '\x43', '\x65', '\x87', + '\x6f', '\xde', '\x20', '\x00', '\x00', '\xb0', '\x5f', '\x9c', + '\x65', '\x6f', '\xed', '\x9b', '\x5f', '\x9c', '\x25', '\x2f', + '\x7f', '\x0d', '\x80', '\x18', '\x00', '\x38', '\xe9', '\x9b', + '\xed', '\x9b', '\x3f', '\x0d', '\x28', '\x01', '\x00', '\x38', + '\xfc', '\xe1', '\x7e', '\xbe', '\x7e', '\x92', '\x7f', '\x0d', + '\x31', '\x00', '\x00', '\xb0', '\xc9', '\x9b', '\x7f', '\x0d', + '\x30', '\x00', '\x00', '\xb0', '\x70', '\x0a', '\x7f', '\x92', + '\x7f', '\x0d', '\x80', '\x18', '\x00', '\x38', '\xc9', '\x9b', + '\x7f', '\x0d', '\x39', '\x00', '\x00', '\xb0', '\xc9', '\x9b', + '\x7f', '\x0d', '\x38', '\x00', '\x00', '\xb0', '\xc9', '\x9b', + '\x7f', '\x0d', '\x22', '\x1d', '\x00', '\x38', '\x70', '\x8a', + '\x6f', '\x9e', '\x20', '\x00', '\x00', '\xb0', '\x69', '\x9a', + '\x79', '\x67', '\x7f', '\x0d', '\xd6', '\x1c', '\x00', '\x38', + '\xe9', '\x9b', '\x6f', '\x9e', '\x22', '\x00', '\x00', '\xb0', + '\x59', '\x9a', '\x59', '\x94', '\x7f', '\x0d', '\x3e', '\x1d', + '\x00', '\x38', '\xe9', '\x9b', '\x6f', '\x9e', '\x04', '\x00', + '\x00', '\xb0', '\x69', '\x9a', '\x06', '\x93', '\xe1', '\x93', + '\x81', '\x92', '\x7f', '\x0d', '\x26', '\x1d', '\x00', '\x38', + '\xc9', '\x9b', '\x7f', '\x0d', '\xe8', '\x1c', '\x00', '\x38', + '\x70', '\x4a', '\x3f', '\xbd', '\x68', '\x02', '\x00', '\x38', + '\x3f', '\xbd', '\x70', '\x04', '\x00', '\x38', '\x3f', '\xbd', + '\x0c', '\x02', '\x00', '\x38', '\x6a', '\xa6', '\xf7', '\x30', + '\x0f', '\x05', '\x6f', '\x9e', '\x00', '\x01', '\x00', '\x38', + '\x69', '\x9a', '\x7f', '\x0d', '\x22', '\x1d', '\x00', '\x38', + '\xe9', '\x9a', '\x24', '\x80', '\x0f', '\x05', '\x6f', '\x9e', + '\x26', '\x1d', '\x00', '\x38', '\x49', '\x9a', '\xcf', '\x9e', + '\x01', '\x00', '\xd3', '\x20', '\x0f', '\x05', '\x6f', '\xde', + '\xd4', '\x01', '\x00', '\xb0', '\x4d', '\x9a', '\x38', '\x93', + '\x41', '\x93', '\xcd', '\x9b', '\xc1', '\xe0', '\x0f', '\x05', + '\x4f', '\x9e', '\x55', '\x00', '\x7f', '\x0d', '\x80', '\x18', + '\x00', '\x38', '\xc9', '\x9b', '\x7f', '\x0d', '\x30', '\x00', + '\x00', '\xb0', '\xc9', '\x9b', '\x3e', '\xbe', '\x3f', '\x0d', + '\xc0', '\x05', '\x00', '\x38', '\xfc', '\xe1', '\x7e', '\xbe', + '\x3f', '\xbd', '\xa2', '\x03', '\x00', '\x38', '\x6a', '\xa6', + '\x16', '\x20', '\x41', '\x92', '\x3f', '\xbd', '\x34', '\x02', + '\x00', '\x38', '\x6a', '\xa6', '\x0a', '\x30', '\x79', '\x86', + '\x3f', '\xbd', '\x70', '\x04', '\x00', '\x38', '\x79', '\x86', + '\x69', '\xa6', '\x3e', '\x0d', '\x84', '\xe2', '\x6f', '\x9e', + '\x22', '\x00', '\x00', '\xb0', '\x59', '\x9a', '\x59', '\x94', + '\xee', '\x9b', '\x6f', '\xce', '\x3e', '\x1d', '\x00', '\x38', + '\x6c', '\x9a', '\x6e', '\xda', '\xad', '\x96', '\xb9', '\x96', + '\xdf', '\x9c', '\x80', '\x25', '\x0a', '\xd0', '\x0f', '\x05', + '\x6e', '\x9a', '\xec', '\x9b', '\x04', '\xe0', '\x41', '\xa2', + '\x7a', '\x86', '\x7f', '\xb6', '\x04', '\xe2', '\x00', '\x00', + '\x88', '\xe2', '\xfe', '\x1b', '\x6f', '\x9e', '\x8c', '\x00', + '\x00', '\xb0', '\x79', '\x8a', '\x69', '\x9a', '\x7f', '\x0d', + '\x90', '\x00', '\x00', '\xb0', '\xe9', '\x9b', '\x6f', '\x9e', + '\x01', '\x40', '\x8c', '\x00', '\x7f', '\x0d', '\x80', '\x00', + '\x00', '\xb0', '\xe9', '\x9b', '\x6f', '\xce', '\x01', '\x00', + '\x01', '\x40', '\x7f', '\x0d', '\x84', '\x00', '\x00', '\xb0', + '\xec', '\xcb', '\x6f', '\xde', '\x8c', '\x00', '\x01', '\x00', + '\x7f', '\x0d', '\x88', '\x00', '\x00', '\xb0', '\xed', '\xdb', + '\x41', '\x12', '\x7f', '\x0d', '\x94', '\x00', '\x00', '\xb0', + '\xe1', '\x1b', '\x7f', '\x0d', '\xa0', '\x00', '\x00', '\xb0', + '\x70', '\x8a', '\x5f', '\x9c', '\x02', '\x01', '\x7f', '\x0d', + '\x9c', '\x00', '\x00', '\xb0', '\xe9', '\x9b', '\x43', '\xc2', + '\x7f', '\x0d', '\x98', '\x00', '\x00', '\xb0', '\xec', '\xcb', + '\x44', '\xd2', '\x7f', '\x0d', '\xd0', '\x01', '\x00', '\xb0', + '\xcd', '\xdb', '\x6f', '\x0e', '\xd4', '\x01', '\x00', '\xb0', + '\xc0', '\xdb', '\x6f', '\xbe', '\xa4', '\x1c', '\x00', '\x38', + '\x6b', '\x96', '\x4f', '\xcc', '\x26', '\x00', '\xd9', '\xcf', + '\x79', '\x4a', '\x6f', '\xde', '\xda', '\x1c', '\x00', '\x38', + '\x04', '\xb1', '\xed', '\xdb', '\x6f', '\x9e', '\xfc', '\x1c', + '\x00', '\x38', '\x08', '\xb1', '\xe9', '\x9b', '\x6d', '\x96', + '\x5f', '\xce', '\xdc', '\x05', '\xd9', '\xcf', '\x47', '\xc2', + '\xd9', '\xcb', '\x6f', '\x9e', '\x04', '\x01', '\x00', '\x38', + '\x69', '\x9a', '\x08', '\xd1', '\xe9', '\x9b', '\x6f', '\xce', + '\xba', '\x1c', '\x00', '\x38', '\x6f', '\x9e', '\x00', '\x8c', + '\x40', '\x02', '\x79', '\x67', '\x6c', '\xd6', '\xed', '\x9f', + '\x5f', '\x9e', '\x00', '\x01', '\x79', '\x27', '\xdd', '\x9b', + '\x6c', '\xa6', '\x86', '\xa2', '\x4f', '\x9c', '\x40', '\x00', + '\x79', '\x27', '\x06', '\xc1', '\xd9', '\x9b', '\x6f', '\x9e', + '\x00', '\x03', '\xaa', '\xaa', '\x79', '\x67', '\x08', '\xc1', + '\xe9', '\x9b', '\x6f', '\x9e', '\x56', '\x88', '\x8c', '\x40', + '\x79', '\x67', '\x0c', '\xc1', '\xe9', '\x9b', '\x7e', '\x92', + '\x79', '\x67', '\x10', '\xc1', '\xe9', '\x9b', '\x14', '\xc1', + '\x70', '\x8a', '\x18', '\xc1', '\x70', '\x8a', '\x6f', '\xde', + '\x2e', '\x1d', '\x00', '\x38', '\x6d', '\x96', '\x4f', '\xcc', + '\x26', '\x00', '\xd9', '\xcf', '\x47', '\xc2', '\xd9', '\xcb', + '\x08', '\xd1', '\xea', '\xab', '\x7f', '\x0d', '\xea', '\x1c', + '\x00', '\x38', '\x70', '\x0a', '\x7f', '\x0d', '\x2a', '\x1d', + '\x00', '\x38', '\x70', '\x8a', '\x7f', '\x0d', '\xa4', '\x01', + '\x00', '\xb0', '\xeb', '\xbb', '\xc0', '\x1b', '\x7f', '\xb6', + '\xbe', '\x1f', '\xfc', '\xe1', '\x7e', '\xbe', '\x84', '\xe2', + '\xfe', '\x0b', '\x6f', '\x0e', '\xda', '\x1c', '\x00', '\x38', + '\x0e', '\x01', '\x5d', '\x9e', '\x81', '\x93', '\xb4', '\xa0', + '\x7a', '\x86', '\x7d', '\x4a', '\x6f', '\x9e', '\xa4', '\x1c', + '\x00', '\x38', '\x7f', '\x0d', '\xa4', '\x01', '\x00', '\xb0', + '\xe9', '\x9b', '\x6f', '\xde', '\x16', '\x1d', '\x00', '\x38', + '\x6d', '\xda', '\x7d', '\x67', '\x6f', '\x9e', '\x2a', '\x1d', + '\x00', '\x38', '\x69', '\x9a', '\x01', '\x92', '\xe9', '\xd6', + '\x8a', '\x20', '\x41', '\xa2', '\x41', '\x92', '\x7f', '\x0d', + '\x26', '\x1d', '\x00', '\x38', '\xc9', '\x9b', '\x6f', '\x9e', + '\x20', '\x00', '\x00', '\xb0', '\x69', '\x9a', '\xf0', '\x93', + '\x7f', '\x0d', '\x3e', '\x1d', '\x00', '\x38', '\xe9', '\x9b', + '\x6f', '\xae', '\x22', '\x1d', '\x00', '\x38', '\x0c', '\x01', + '\x5b', '\xb8', '\x6a', '\xda', '\x2b', '\xd6', '\x84', '\xd2', + '\xea', '\xdb', '\x08', '\x01', '\x6c', '\x9e', '\x2b', '\x96', + '\x84', '\x92', '\xec', '\x9b', '\x60', '\xc6', '\x6f', '\xbe', + '\x00', '\x01', '\x00', '\x38', '\x6b', '\x9a', '\xad', '\x96', + '\x84', '\x92', '\xdf', '\x9c', '\xdb', '\x05', '\x0a', '\x90', + '\x0f', '\x05', '\x6b', '\x9a', '\x9a', '\x9a', '\x06', '\xe0', + '\x04', '\x92', '\x5f', '\x9e', '\xdc', '\x05', '\xdc', '\x9b', + '\x6f', '\xce', '\xda', '\x1c', '\x00', '\x38', '\x5c', '\xda', + '\x5d', '\x94', '\x26', '\x92', '\xcf', '\x9c', '\x3f', '\x00', + '\x04', '\x90', '\x0f', '\x05', '\x5a', '\xd2', '\xdc', '\xdb', + '\x6f', '\xde', '\x2a', '\x1d', '\x00', '\x38', '\x6d', '\x9a', + '\x01', '\x92', '\xed', '\x9b', '\x3f', '\xbd', '\x70', '\x04', + '\x00', '\x38', '\x41', '\xa2', '\xbe', '\x0f', '\x3e', '\x0d', + '\x6f', '\x9e', '\xea', '\x1c', '\x00', '\x38', '\x89', '\x0b', + '\x44', '\x20', '\x41', '\xc2', '\xc9', '\xcb', '\x6f', '\x9e', + '\x04', '\x00', '\x00', '\xb0', '\x69', '\x9a', '\x06', '\x93', + '\xc4', '\x92', '\x1e', '\x20', '\x0f', '\x05', '\x6f', '\x9e', + '\xb4', '\x1c', '\x00', '\x38', '\x6f', '\xde', '\xdc', '\x00', + '\x00', '\x38', '\x6d', '\xda', '\xe9', '\xdf', '\x6f', '\xce', + '\xe0', '\x00', '\x00', '\x38', '\x5c', '\xca', '\x16', '\xe0', + '\xd9', '\xcb', '\x6f', '\xde', '\xb4', '\x1c', '\x00', '\x38', + '\x6f', '\x9e', '\x02', '\x1d', '\x00', '\x38', '\x69', '\xce', + '\xed', '\xcf', '\x59', '\x9a', '\xdd', '\x9b', '\x6f', '\xde', + '\xb4', '\x1c', '\x00', '\x38', '\x6f', '\x9e', '\x2a', '\x1d', + '\x00', '\x38', '\x69', '\x9a', '\x79', '\x67', '\x1a', '\xd1', + '\xe9', '\x9b', '\x42', '\x92', '\x79', '\x67', '\x1e', '\xd1', + '\xe9', '\x9b', '\x6f', '\x9e', '\x2e', '\x1d', '\x00', '\x38', + '\x47', '\xd2', '\x02', '\x91', '\xdd', '\xdb', '\x4f', '\xcc', + '\x26', '\x00', '\xd9', '\xcb', '\x3f', '\x0d', '\xf2', '\x04', + '\x00', '\x38', '\x6f', '\x9e', '\x2e', '\x1d', '\x00', '\x38', + '\x7f', '\x0d', '\xa0', '\x01', '\x00', '\xb0', '\xe9', '\x9b', + '\x41', '\x92', '\x7f', '\x0d', '\xd0', '\x01', '\x00', '\xb0', + '\xc9', '\x9b', '\x6f', '\x9e', '\xa0', '\x01', '\x00', '\xb0', + '\x69', '\x9a', '\xf7', '\x20', '\x0f', '\x05', '\x7f', '\xb6', + '\x0f', '\x05', '\x6f', '\x9e', '\x2e', '\x1d', '\x00', '\x38', + '\x6f', '\xce', '\xec', '\x1c', '\x00', '\x38', '\x04', '\x91', + '\xec', '\xcb', '\x02', '\x91', '\x70', '\x4a', '\x8a', '\x0b', + '\x0c', '\x30', '\x7d', '\x86', '\x01', '\xd2', '\x4a', '\xd5', + '\x80', '\x0b', '\xf9', '\x20', '\x0f', '\x05', '\x7f', '\x0d', + '\xd2', '\x1c', '\x00', '\x38', '\x70', '\x8a', '\x6f', '\x9e', + '\xec', '\x1c', '\x00', '\x38', '\x47', '\xc2', '\x02', '\x91', + '\xdc', '\xcb', '\x08', '\x91', '\xea', '\xab', '\x01', '\xd2', + '\xd9', '\xdb', '\x3f', '\x0d', '\xf2', '\x04', '\x00', '\x38', + '\xfc', '\xe1', '\x7e', '\xbe', '\x84', '\xe2', '\xee', '\xab', + '\x6f', '\x9e', '\x2e', '\x1d', '\x00', '\x38', '\x6f', '\xde', + '\xec', '\x1c', '\x00', '\x38', '\x04', '\x91', '\xed', '\xdb', + '\x02', '\x91', '\x70', '\x4a', '\x4b', '\xb6', '\x04', '\x20', + '\x46', '\x92', '\x45', '\x92', '\x79', '\x67', '\x7f', '\x0d', + '\xd2', '\x1c', '\x00', '\x38', '\xe9', '\x9b', '\x79', '\x86', + '\x01', '\x92', '\xdf', '\x9c', '\x00', '\x40', '\xf9', '\x20', + '\x0f', '\x05', '\x6e', '\x9a', '\x79', '\x67', '\xee', '\x9b', + '\x6f', '\x9e', '\xec', '\x1c', '\x00', '\x38', '\x47', '\xd2', + '\x02', '\x91', '\xdd', '\xdb', '\x08', '\x91', '\xee', '\xeb', + '\x44', '\xd2', '\xd9', '\xdb', '\x3f', '\xbd', '\xf2', '\x04', + '\x00', '\x38', '\x04', '\xe2', '\x3e', '\x0d', '\x00', '\x00', + '\xfc', '\xe1', '\x7e', '\xbe', '\x84', '\xe2', '\xfe', '\x0b', + '\x4f', '\x9e', '\xaa', '\xff', '\x7f', '\x0d', '\x80', '\x18', + '\x00', '\x38', '\xc9', '\x9b', '\x7f', '\x0d', '\x30', '\x00', + '\x00', '\xb0', '\xc9', '\x9b', '\x6f', '\x0e', '\x1a', '\x05', + '\x00', '\x38', '\x6f', '\xae', '\x84', '\x18', '\x00', '\x38', + '\xb0', '\xb9', '\x6f', '\xae', '\xd6', '\x1c', '\x00', '\x38', + '\x6a', '\xaa', '\x7a', '\x67', '\x41', '\xb2', '\x3f', '\xbd', + '\x60', '\x05', '\x00', '\x38', '\x6f', '\xae', '\x50', '\x1c', + '\x00', '\x38', '\xb0', '\xb9', '\x6f', '\x9e', '\xf0', '\x00', + '\x00', '\x38', '\xef', '\x9e', '\x96', '\x1c', '\x00', '\x38', + '\x0e', '\x30', '\x70', '\x86', '\x09', '\x0c', '\xef', '\x9e', + '\x96', '\x1c', '\x00', '\x38', '\xf7', '\x20', '\x0f', '\x05', + '\x6f', '\xae', '\x96', '\x18', '\x00', '\x38', '\x3f', '\xbd', + '\x1a', '\x05', '\x00', '\x38', '\x60', '\xa6', '\x41', '\xb2', + '\x3f', '\xbd', '\x60', '\x05', '\x00', '\x38', '\x3f', '\xbd', + '\x88', '\x06', '\x00', '\x38', '\x3f', '\x0d', '\x28', '\x01', + '\x00', '\x38', '\xbe', '\x0f', '\x3e', '\x0d', '\x84', '\xe2', + '\x4f', '\x9e', '\x55', '\x00', '\x7f', '\x0d', '\x80', '\x18', + '\x00', '\x38', '\xc9', '\x9b', '\x7f', '\x0d', '\x30', '\x00', + '\x00', '\xb0', '\xc9', '\x9b', '\x6f', '\x9e', '\x30', '\x00', + '\x00', '\xb0', '\x69', '\xda', '\x7d', '\x87', '\x7f', '\x0d', + '\x80', '\x18', '\x00', '\x38', '\xcd', '\xdb', '\xc9', '\xdb', + '\x7e', '\x8a', '\x6e', '\x9a', '\xef', '\x9e', '\x80', '\x84', + '\x1e', '\x00', '\xe1', '\x30', '\x0f', '\x05', '\x6e', '\x9a', + '\x01', '\x92', '\xee', '\x9b', '\xed', '\xe0', '\x0f', '\x05', + '\xfc', '\xe1', '\x7e', '\xbe', '\x84', '\xe2', '\xfe', '\x0b', + '\x6f', '\x0e', '\x1a', '\x05', '\x00', '\x38', '\x6f', '\xae', + '\xb2', '\x18', '\x00', '\x38', '\xb0', '\xb9', '\x3f', '\xbd', + '\x70', '\x04', '\x00', '\x38', '\x6f', '\xae', '\x00', '\x1f', + '\x00', '\x38', '\x5f', '\xbc', '\xec', '\x01', '\x3f', '\xbd', + '\x06', '\x0a', '\x00', '\x38', '\x6f', '\xae', '\xcc', '\x18', + '\x00', '\x38', '\xb0', '\xb9', '\x3f', '\xbd', '\xcc', '\x06', + '\x00', '\x38', '\xbe', '\x0f', '\x3e', '\xbe', '\x3f', '\x0d', + '\x46', '\x06', '\x00', '\x38', '\xfc', '\xe1', '\x7e', '\xbe', + '\x98', '\xe2', '\xfe', '\x4b', '\x6f', '\xde', '\x00', '\x1f', + '\x00', '\x38', '\x6d', '\x9a', '\x79', '\x67', '\xed', '\x9f', + '\xef', '\xde', '\xec', '\x20', '\x00', '\x38', '\xf3', '\x20', + '\x0f', '\x05', '\x6f', '\x3e', '\x00', '\x1f', '\x00', '\x38', + '\xa3', '\x0b', '\xff', '\x3d', '\xfe', '\x02', '\x0f', '\x05', + '\x63', '\x9a', '\x81', '\x92', '\xcf', '\x9d', '\x0b', '\x00', + '\x5f', '\x95', '\x3f', '\xf8', '\x54', '\x02', '\x22', '\x01', + '\x18', '\x00', '\x62', '\x00', '\x90', '\x00', '\x96', '\x01', + '\xc8', '\x01', '\xe4', '\x00', '\x00', '\x02', '\xb8', '\x00', + '\x9a', '\x02', '\xce', '\x02', '\x6f', '\xae', '\xde', '\x18', + '\x00', '\x38', '\x3f', '\xbd', '\x1a', '\x05', '\x00', '\x38', + '\x6f', '\x0e', '\x60', '\x05', '\x00', '\x38', '\x04', '\x31', + '\x62', '\xae', '\x41', '\xb2', '\xb0', '\xb9', '\x08', '\x31', + '\x61', '\xae', '\x41', '\xb2', '\xb0', '\xb9', '\x6f', '\x0e', + '\x2a', '\x1d', '\x00', '\x38', '\x60', '\x9a', '\x81', '\x92', + '\xe0', '\x9b', '\x3f', '\xbd', '\x70', '\x04', '\x00', '\x38', + '\x60', '\x9a', '\x01', '\x92', '\xe0', '\x9b', '\x62', '\xaa', + '\x61', '\xba', '\x3f', '\xbd', '\x06', '\x0a', '\x00', '\x38', + '\xff', '\xed', '\x88', '\x02', '\x0c', '\x32', '\x6f', '\xae', + '\xec', '\x18', '\x00', '\x38', '\x3f', '\xbd', '\x1a', '\x05', + '\x00', '\x38', '\x6f', '\x0e', '\x60', '\x05', '\x00', '\x38', + '\x04', '\x31', '\x62', '\xae', '\x41', '\xb2', '\xb0', '\xb9', + '\x08', '\x31', '\x61', '\xae', '\x41', '\xb2', '\xb0', '\xb9', + '\x61', '\x1a', '\x72', '\x09', '\xe1', '\x1b', '\xff', '\xed', + '\x5a', '\x02', '\x0c', '\x32', '\x6f', '\xae', '\xfc', '\x18', + '\x00', '\x38', '\x3f', '\xbd', '\x1a', '\x05', '\x00', '\x38', + '\x6f', '\x1e', '\x60', '\x05', '\x00', '\x38', '\x04', '\x31', + '\x60', '\xae', '\x41', '\xb2', '\xb1', '\xb9', '\x60', '\xaa', + '\x6a', '\xaa', '\x41', '\xb2', '\xb1', '\xb9', '\xff', '\xed', + '\x32', '\x02', '\x08', '\x32', '\x6f', '\xae', '\x0c', '\x19', + '\x00', '\x38', '\x3f', '\xbd', '\x1a', '\x05', '\x00', '\x38', + '\x04', '\x31', '\x60', '\xae', '\x41', '\xb2', '\x3f', '\xbd', + '\x60', '\x05', '\x00', '\x38', '\x60', '\xaa', '\xff', '\x3d', + '\xc0', '\x01', '\x0f', '\x05', '\x81', '\xa2', '\xfd', '\x20', + '\x0f', '\x05', '\xff', '\xed', '\x06', '\x02', '\x08', '\x32', + '\x6f', '\x4e', '\x1a', '\x05', '\x00', '\x38', '\x6f', '\xae', + '\x1a', '\x19', '\x00', '\x38', '\xb4', '\xb9', '\x6f', '\x0e', + '\x60', '\x05', '\x00', '\x38', '\x04', '\x31', '\x62', '\xae', + '\x41', '\xb2', '\xb0', '\xb9', '\x08', '\x31', '\x61', '\xae', + '\x41', '\xb2', '\xb0', '\xb9', '\x62', '\x2a', '\x62', '\x2a', + '\xe1', '\x2a', '\xff', '\x3d', '\xb8', '\x01', '\x0f', '\x05', + '\x6f', '\xae', '\x28', '\x19', '\x00', '\x38', '\xb4', '\xb9', + '\xff', '\xed', '\xd0', '\x01', '\x0f', '\x05', '\x6f', '\x4e', + '\x1a', '\x05', '\x00', '\x38', '\x6f', '\xae', '\x38', '\x19', + '\x00', '\x38', '\xb4', '\xb9', '\x6f', '\x2e', '\x60', '\x05', + '\x00', '\x38', '\x04', '\x31', '\x61', '\xae', '\x41', '\xb2', + '\xb2', '\xb9', '\x08', '\x31', '\x60', '\xae', '\x41', '\xb2', + '\xb2', '\xb9', '\x61', '\xaa', '\x60', '\xba', '\x6e', '\xc6', + '\x14', '\xc2', '\x3f', '\xbd', '\x04', '\x0b', '\x00', '\x38', + '\x6a', '\xa6', '\x30', '\x20', '\x0f', '\x05', '\x6f', '\xae', + '\x44', '\x19', '\x00', '\x38', '\xb4', '\xb9', '\x14', '\xe1', + '\x6a', '\xaa', '\x41', '\xb2', '\xb2', '\xb9', '\x14', '\xe1', + '\x6a', '\xaa', '\x6a', '\xb6', '\x0f', '\xbc', '\x40', '\x00', + '\x8f', '\xac', '\x40', '\x00', '\x3c', '\xa3', '\x3c', '\xb3', + '\x3f', '\xbd', '\xac', '\x0b', '\x00', '\x38', '\xff', '\xed', + '\x6a', '\x01', '\x0f', '\x05', '\x6f', '\xae', '\x60', '\x19', + '\x00', '\x38', '\xb4', '\xb9', '\xff', '\xed', '\x54', '\x01', + '\x0c', '\x32', '\x6f', '\xae', '\x76', '\x19', '\x00', '\x38', + '\x3f', '\xbd', '\x1a', '\x05', '\x00', '\x38', '\x6f', '\x0e', + '\x60', '\x05', '\x00', '\x38', '\x04', '\x31', '\x62', '\xae', + '\x41', '\xb2', '\xb0', '\xb9', '\x08', '\x31', '\x61', '\xae', + '\x41', '\xb2', '\xb0', '\xb9', '\x62', '\xaa', '\x61', '\xba', + '\x3f', '\xbd', '\xac', '\x0b', '\x00', '\x38', '\xff', '\xed', + '\x22', '\x01', '\x0c', '\x32', '\x6f', '\xae', '\x82', '\x19', + '\x00', '\x38', '\x3f', '\xbd', '\x1a', '\x05', '\x00', '\x38', + '\x6f', '\x0e', '\x60', '\x05', '\x00', '\x38', '\x04', '\x31', + '\x62', '\xae', '\x41', '\xb2', '\xb0', '\xb9', '\x08', '\x31', + '\x61', '\xae', '\x41', '\xb2', '\xb0', '\xb9', '\x62', '\xaa', + '\xe1', '\xaa', '\xda', '\x90', '\x0f', '\x05', '\x7a', '\x0e', + '\x08', '\x31', '\xea', '\xaa', '\xf9', '\x80', '\x0f', '\x05', + '\xea', '\xe0', '\x0c', '\x32', '\x6f', '\xae', '\x8e', '\x19', + '\x00', '\x38', '\x3f', '\xbd', '\x1a', '\x05', '\x00', '\x38', + '\x6f', '\x0e', '\x60', '\x05', '\x00', '\x38', '\x04', '\x31', + '\x61', '\xae', '\x41', '\xb2', '\xb0', '\xb9', '\x08', '\x31', + '\x64', '\xae', '\x41', '\xb2', '\xb0', '\xb9', '\x0c', '\x31', + '\x62', '\xae', '\x41', '\xb2', '\xb0', '\xb9', '\x6f', '\x0e', + '\x4a', '\x15', '\x00', '\x38', '\x61', '\xaa', '\x64', '\xba', + '\x62', '\xca', '\xb0', '\xb9', '\x6a', '\xa6', '\xac', '\x30', + '\x10', '\x32', '\xc3', '\xa2', '\xae', '\x20', '\x7a', '\x86', + '\x62', '\xca', '\xef', '\xcd', '\x00', '\x00', '\x01', '\x00', + '\x64', '\xba', '\xb0', '\xb9', '\x9e', '\xe0', '\x0f', '\x05', + '\x6f', '\xde', '\xb4', '\x1c', '\x00', '\x38', '\x6d', '\x9a', + '\x7f', '\x0d', '\xc0', '\x01', '\x00', '\xb0', '\xe9', '\x9b', + '\x04', '\xd1', '\x59', '\x98', '\x7f', '\x0d', '\xc4', '\x01', + '\x00', '\xb0', '\xe9', '\x9b', '\x6f', '\x1e', '\x1a', '\x05', + '\x00', '\x38', '\x6f', '\xae', '\x96', '\x19', '\x00', '\x38', + '\xb1', '\xb9', '\x04', '\x31', '\x60', '\xae', '\x41', '\xb2', + '\x3f', '\xbd', '\x60', '\x05', '\x00', '\x38', '\x6f', '\xae', + '\x9e', '\x19', '\x00', '\x38', '\xb1', '\xb9', '\x60', '\x9a', + '\xb9', '\x09', '\x50', '\xe0', '\x08', '\x32', '\x6f', '\xae', + '\x12', '\x19', '\x00', '\x38', '\x3f', '\xbd', '\x1a', '\x05', + '\x00', '\x38', '\x6f', '\x0e', '\x60', '\x05', '\x00', '\x38', + '\x04', '\x31', '\x61', '\xae', '\x41', '\xb2', '\xb0', '\xb9', + '\x08', '\x31', '\x62', '\xae', '\x41', '\xb2', '\xb0', '\xb9', + '\x61', '\x1a', '\x61', '\x9a', '\x08', '\x30', '\x81', '\x92', + '\xe1', '\x9b', '\x20', '\xe0', '\x62', '\x3a', '\x1c', '\xe0', + '\x0c', '\x32', '\x6f', '\xae', '\xa4', '\x19', '\x00', '\x38', + '\x3f', '\xbd', '\x1a', '\x05', '\x00', '\x38', '\x63', '\xaa', + '\x41', '\xb2', '\x3f', '\xbd', '\x60', '\x05', '\x00', '\x38', + '\x0a', '\xe0', '\x0f', '\x05', '\xa3', '\x0b', '\xff', '\x2d', + '\x06', '\xfd', '\x0f', '\x05', '\x6f', '\xae', '\x9e', '\x19', + '\x00', '\x38', '\x3f', '\xbd', '\x1a', '\x05', '\x00', '\x38', + '\xbe', '\x4f', '\x04', '\xe2', '\x3e', '\x0d', '\xfc', '\xe1', + '\x7e', '\xbe', '\x8c', '\xe2', '\xfe', '\x2b', '\x6a', '\x26', + '\x6b', '\x06', '\x7f', '\x0d', '\x22', '\x1d', '\x00', '\x38', + '\x70', '\x8a', '\x7f', '\x0d', '\x04', '\x01', '\x00', '\x38', + '\xea', '\xab', '\x6f', '\x9e', '\x26', '\x1d', '\x00', '\x38', + '\x49', '\x9a', '\xcf', '\x9e', '\x01', '\x00', '\x86', '\x20', + '\x0f', '\x05', '\x6f', '\xde', '\xda', '\x1c', '\x00', '\x38', + '\x08', '\xd1', '\xea', '\xab', '\x7f', '\x0d', '\x00', '\x01', + '\x00', '\x38', '\xeb', '\xbb', '\x6b', '\x96', '\x04', '\x92', + '\xdf', '\x9d', '\xdc', '\x05', '\xdd', '\x9b', '\x6f', '\x9e', + '\xa4', '\x01', '\x00', '\xb0', '\x69', '\xda', '\x6f', '\xde', + '\xa4', '\x1c', '\x00', '\x38', '\xe9', '\xdb', '\x6f', '\xde', + '\xd4', '\x01', '\x00', '\xb0', '\x4d', '\x9a', '\x38', '\x93', + '\x44', '\x93', '\xcd', '\x9b', '\x6f', '\xde', '\xd4', '\x01', + '\x00', '\xb0', '\x4d', '\x9a', '\x07', '\x93', '\xcf', '\x9e', + '\x04', '\x00', '\xf7', '\x30', '\x0f', '\x05', '\x4d', '\x9a', + '\x38', '\x93', '\x41', '\x93', '\xcd', '\x9b', '\x3f', '\xbd', + '\x0c', '\x02', '\x00', '\x38', '\x6a', '\xa6', '\xf7', '\x30', + '\x0f', '\x05', '\x6f', '\xce', '\x22', '\x1d', '\x00', '\x38', + '\xec', '\x0a', '\x10', '\x80', '\x0f', '\x05', '\x6f', '\xde', + '\xd4', '\x01', '\x00', '\xb0', '\x4d', '\x9a', '\x38', '\x93', + '\x41', '\x93', '\xcd', '\x9b', '\xec', '\x0a', '\xd7', '\x90', + '\x71', '\x86', '\x22', '\xe0', '\x62', '\x96', '\x7f', '\x0d', + '\x22', '\x1d', '\x00', '\x38', '\xeb', '\xba', '\x14', '\x80', + '\x71', '\x86', '\x3f', '\xbd', '\x0c', '\x02', '\x00', '\x38', + '\x7f', '\x0d', '\x22', '\x1d', '\x00', '\x38', '\xe0', '\x0a', + '\xf1', '\x90', '\x71', '\x86', '\x62', '\x96', '\x20', '\x96', + '\xe9', '\x26', '\x0e', '\x30', '\x62', '\xd6', '\x0d', '\x1c', + '\x62', '\x96', '\x20', '\x96', '\xe9', '\xd6', '\xf7', '\x20', + '\x0f', '\x05', '\x6f', '\xae', '\xb8', '\x19', '\x00', '\x38', + '\x3f', '\xbd', '\x1a', '\x05', '\x00', '\x38', '\x61', '\xa6', + '\x41', '\xb2', '\xbe', '\x2f', '\x3e', '\xbe', '\x3f', '\x0d', + '\x60', '\x05', '\x00', '\x38', '\xfc', '\xe1', '\x7e', '\xbe', + '\x8c', '\xe2', '\xfe', '\x2b', '\x6b', '\x06', '\x6c', '\x26', + '\xeb', '\xa6', '\x40', '\x00', '\x6a', '\xc6', '\xe0', '\xc6', + '\x32', '\x00', '\x71', '\x86', '\x6c', '\xb6', '\x6c', '\x96', + '\x79', '\x87', '\x61', '\xd6', '\xc3', '\xd3', '\xed', '\x97', + '\x49', '\xd6', '\xcb', '\x9b', '\x4b', '\x9a', '\xcd', '\x96', + '\x0c', '\x30', '\x7d', '\x87', '\x6f', '\xae', '\xce', '\x19', + '\x00', '\x38', '\x40', '\xe0', '\xe2', '\xbb', '\xcb', '\xdf', + '\x01', '\x12', '\xc4', '\x12', '\x06', '\x30', '\xe0', '\xb6', + '\xd7', '\x10', '\x6c', '\x96', '\x04', '\xc2', '\xe0', '\xc6', + '\xc5', '\x10', '\x0f', '\x05', '\xe0', '\xa6', '\x4e', '\x00', + '\x6a', '\xc6', '\xe0', '\xc6', '\x40', '\x00', '\x71', '\x86', + '\x6c', '\xa6', '\x61', '\x96', '\xc3', '\x93', '\x6c', '\xd6', + '\xe9', '\xd7', '\x4a', '\x9a', '\xcd', '\x96', '\x22', '\x30', + '\x01', '\x12', '\x81', '\x12', '\xe2', '\xab', '\x6f', '\xae', + '\xec', '\x19', '\x00', '\x38', '\x3f', '\xbd', '\x1a', '\x05', + '\x00', '\x38', '\x62', '\xaa', '\x41', '\xb2', '\x3f', '\xbd', + '\x60', '\x05', '\x00', '\x38', '\x7a', '\x86', '\xbe', '\x2f', + '\x3e', '\x0d', '\xc4', '\x12', '\x08', '\x30', '\x01', '\xa2', + '\xe0', '\xa6', '\xc9', '\x10', '\x61', '\x96', '\x04', '\xc2', + '\xe0', '\xc6', '\xb7', '\x10', '\x0f', '\x05', '\x41', '\xa2', + '\xbe', '\x2f', '\x3e', '\x0d', '\xfc', '\xe1', '\x7e', '\xbe', + '\x94', '\xe2', '\xfe', '\x4b', '\x6b', '\x26', '\xeb', '\xa6', + '\x5a', '\x90', '\x6a', '\x06', '\x60', '\xa6', '\x7b', '\x86', + '\x3f', '\xbd', '\x60', '\x05', '\x00', '\x38', '\x6f', '\xae', + '\x0a', '\x1a', '\x00', '\x38', '\x3f', '\xbd', '\x1a', '\x05', + '\x00', '\x38', '\xe2', '\x06', '\x2a', '\x90', '\x74', '\x86', + '\x60', '\x16', '\x60', '\x36', '\x6f', '\xae', '\x60', '\x1a', + '\x00', '\x38', '\x3f', '\xbd', '\x1a', '\x05', '\x00', '\x38', + '\x63', '\xae', '\x7b', '\x86', '\x3f', '\xbd', '\x60', '\x05', + '\x00', '\x38', '\x01', '\x42', '\xc4', '\x42', '\x08', '\x30', + '\x04', '\x12', '\xe2', '\x16', '\xdf', '\x80', '\x0f', '\x05', + '\x6f', '\xae', '\xc8', '\x18', '\x00', '\x38', '\x3f', '\xbd', + '\x1a', '\x05', '\x00', '\x38', '\x10', '\x02', '\xe2', '\x06', + '\xad', '\x80', '\x60', '\xa6', '\xbe', '\x4f', '\x3e', '\x0d', + '\x05', '\xa1', '\x49', '\x98', '\xc2', '\x92', '\x0a', '\x30', + '\xc4', '\x92', '\x0e', '\x30', '\x0f', '\x05', '\x7f', '\xb6', + '\x7a', '\x86', '\x6a', '\xb9', '\x5a', '\xa8', '\x7f', '\xb6', + '\x0f', '\x05', '\x6a', '\xb9', '\x6a', '\xaa', '\x7f', '\xb6', + '\x0f', '\x05', '\x6a', '\xd6', '\x05', '\xa1', '\x4a', '\xaa', + '\x4a', '\x94', '\xc2', '\x92', '\x0a', '\x30', '\xc4', '\x92', + '\x10', '\x30', '\x0f', '\x05', '\x7f', '\xb6', '\x7a', '\x86', + '\x5c', '\xca', '\x6d', '\xb9', '\xdc', '\xcb', '\x7f', '\xb6', + '\x4a', '\xa4', '\x6c', '\xca', '\x6d', '\xb9', '\xec', '\xcb', + '\x4a', '\xa4', '\x7f', '\xb6', '\x0f', '\x05', '\xfc', '\xe1', + '\x7e', '\xbe', '\x84', '\xe2', '\xee', '\xbb', '\x04', '\xa1', + '\x49', '\x9a', '\xcf', '\x9e', '\x01', '\x00', '\x06', '\x20', + '\x0f', '\x05', '\x24', '\xe0', '\xc1', '\xc3', '\xcf', '\x9e', + '\x02', '\x00', '\x0c', '\x20', '\x6b', '\x96', '\xd0', '\x93', + '\x69', '\xb7', '\xee', '\xbb', '\x12', '\xe0', '\xc2', '\xc3', + '\x6f', '\xae', '\x36', '\x1a', '\x00', '\x38', '\x3f', '\xbd', + '\x1a', '\x05', '\x00', '\x38', '\x0c', '\xe0', '\x0f', '\x05', + '\x6c', '\xb6', '\x6e', '\xc6', '\x3f', '\xbd', '\x3a', '\x0c', + '\x00', '\x38', '\x04', '\xe2', '\x3e', '\x0d', '\xfc', '\xe1', + '\x7e', '\xbe', '\x84', '\xe2', '\xfe', '\x0b', '\x6a', '\x06', + '\x4f', '\xbc', '\xaa', '\x00', '\x5f', '\xcc', '\x55', '\x05', + '\x3f', '\xbd', '\x66', '\x0c', '\x00', '\x38', '\x60', '\xa6', + '\x4f', '\xbc', '\x55', '\x00', '\x5f', '\xcc', '\xaa', '\x02', + '\xbe', '\x0f', '\x3e', '\xbe', '\x3f', '\x0d', '\x66', '\x0c', + '\x00', '\x38', '\xfc', '\xe1', '\x7e', '\xbe', '\x90', '\xe2', + '\xfe', '\x3b', '\x6a', '\x26', '\x04', '\xa1', '\x49', '\x9a', + '\xcf', '\x9e', '\x02', '\x00', '\x42', '\x20', '\x6b', '\x36', + '\x6f', '\x0e', '\x18', '\x0c', '\x00', '\x38', '\xb0', '\xb9', + '\x6a', '\x16', '\x62', '\xa6', '\x63', '\xb6', '\xb0', '\xb9', + '\x61', '\xd6', '\xf0', '\xd3', '\x1f', '\xdf', '\x40', '\x00', + '\x6a', '\x96', '\xf0', '\x93', '\x1f', '\x9f', '\x40', '\x00', + '\xe9', '\xd6', '\x14', '\x20', '\x7c', '\x86', '\x2f', '\x1f', + '\x40', '\x00', '\x00', '\x00', '\x2f', '\xaf', '\x40', '\x00', + '\x00', '\x00', '\xea', '\x16', '\x04', '\x30', '\x0f', '\x05', + '\x41', '\xc2', '\x6c', '\xa6', '\xbe', '\x3f', '\x3e', '\x0d', + '\x6f', '\x1e', '\x18', '\x0c', '\x00', '\x38', '\xb1', '\xb9', + '\x4a', '\x04', '\x0f', '\x0f', '\x40', '\x00', '\x62', '\xa6', + '\x63', '\xb6', '\xb1', '\xb9', '\x2f', '\xaf', '\x40', '\x00', + '\x00', '\x00', '\xea', '\x06', '\x3a', '\x25', '\xbe', '\x3f', + '\x3e', '\x0d', '\xfc', '\xe1', '\x7e', '\xbe', '\xa8', '\xe2', + '\xfe', '\x8b', '\x6a', '\x36', '\x04', '\xa1', '\x44', '\x9e', + '\xcf', '\x9e', '\x02', '\x00', '\x04', '\x20', '\x41', '\x72', + '\x42', '\x72', '\x6f', '\x2e', '\x66', '\x0c', '\x00', '\x38', + '\x4f', '\xbc', '\x98', '\x00', '\x4f', '\xcc', '\x55', '\x00', + '\xb2', '\xb9', '\x50', '\xb2', '\xe7', '\xb4', '\x6f', '\x1e', + '\x18', '\x0c', '\x00', '\x38', '\x63', '\xa6', '\xb1', '\xb9', + '\xcf', '\xae', '\x51', '\x00', '\xff', '\x2d', '\x9c', '\x01', + '\x63', '\xa6', '\x51', '\xb2', '\xe7', '\xb4', '\xb1', '\xb9', + '\xcf', '\xae', '\x52', '\x00', '\xff', '\x2d', '\x8c', '\x01', + '\x63', '\xa6', '\x52', '\xb2', '\xe7', '\xb4', '\xb1', '\xb9', + '\xcf', '\xae', '\x59', '\x00', '\xff', '\x2d', '\x7c', '\x01', + '\x63', '\xa6', '\x24', '\xe1', '\x70', '\x8a', '\x6f', '\xae', + '\x50', '\x1a', '\x00', '\x38', '\x3f', '\xbd', '\x1a', '\x05', + '\x00', '\x38', '\x63', '\xaa', '\x41', '\xb2', '\x3f', '\xbd', + '\x60', '\x05', '\x00', '\x38', '\x4f', '\xbc', '\x27', '\x00', + '\xe7', '\xb4', '\x63', '\xa6', '\xb1', '\xb9', '\x41', '\x92', + '\xea', '\x94', '\x06', '\x32', '\xe3', '\x9b', '\x86', '\x32', + '\x4f', '\xbc', '\x2c', '\x00', '\xe7', '\xb4', '\x63', '\xa6', + '\xb1', '\xb9', '\x6a', '\x86', '\x55', '\xb2', '\xe7', '\xb4', + '\x63', '\xa6', '\xb1', '\xb9', '\x6a', '\x06', '\x6a', '\xb6', + '\x04', '\xb2', '\xe7', '\xb4', '\x63', '\xa6', '\xb1', '\xb9', + '\xcf', '\xae', '\x30', '\x00', '\x3e', '\x20', '\x63', '\xa6', + '\x4f', '\xbc', '\xf0', '\x00', '\x5f', '\xcc', '\x55', '\x05', + '\xb2', '\xb9', '\x63', '\xa6', '\x3f', '\xbd', '\xae', '\x0c', + '\x00', '\x38', '\x63', '\xa6', '\x4f', '\xbc', '\x90', '\x00', + '\x5f', '\xcc', '\x55', '\x05', '\xb2', '\xb9', '\x44', '\xb8', + '\x2b', '\xb6', '\x63', '\xa6', '\xb1', '\xb9', '\x4a', '\x54', + '\x0f', '\x5f', '\x80', '\xff', '\x63', '\xa6', '\x4f', '\xbc', + '\x98', '\x00', '\x4f', '\xcc', '\x55', '\x00', '\xb2', '\xb9', + '\x10', '\xe0', '\x0f', '\x05', '\x0f', '\x02', '\xe7', '\x04', + '\x60', '\xb6', '\xb1', '\xb9', '\xcf', '\xae', '\x03', '\x00', + '\x35', '\x35', '\x0a', '\x31', '\xd8', '\x8b', '\xc8', '\x82', + '\x12', '\xd0', '\x68', '\x46', '\x6f', '\xae', '\x62', '\x1a', + '\x00', '\x38', '\x3f', '\xbd', '\x1a', '\x05', '\x00', '\x38', + '\xd2', '\xe0', '\x7a', '\x86', '\x65', '\x56', '\x94', '\x20', + '\x81', '\x42', '\x90', '\xe0', '\x74', '\x86', '\xc2', '\x03', + '\x60', '\xb6', '\x2f', '\xb2', '\xe7', '\xb4', '\x6f', '\x1e', + '\x18', '\x0c', '\x00', '\x38', '\x63', '\xa6', '\xb1', '\xb9', + '\x6a', '\x66', '\x60', '\xb6', '\x30', '\xb2', '\xe7', '\xb4', + '\x63', '\xa6', '\xb1', '\xb9', '\xc8', '\xa3', '\x6a', '\x67', + '\xc8', '\x63', '\x60', '\xb6', '\x2d', '\xb2', '\xe7', '\xb4', + '\x63', '\xa6', '\xb1', '\xb9', '\x6a', '\x26', '\x2e', '\x02', + '\xe7', '\x04', '\x63', '\xa6', '\x60', '\xb6', '\xb1', '\xb9', + '\xc8', '\xa3', '\x6a', '\x27', '\x65', '\x56', '\x0a', '\x30', + '\x01', '\x22', '\x68', '\x96', '\xa4', '\x96', '\x04', '\xe0', + '\x81', '\x92', '\x64', '\x96', '\x19', '\x95', '\x63', '\xd6', + '\x2d', '\x95', '\x6d', '\x96', '\x24', '\xe1', '\x6d', '\xda', + '\x0c', '\x91', '\xed', '\xdb', '\x10', '\x91', '\xe6', '\x6b', + '\x14', '\x91', '\xe2', '\x2b', '\x62', '\x26', '\x10', '\xd0', + '\x0f', '\x05', '\x24', '\xe1', '\x29', '\x6a', '\x24', '\xe1', + '\xe9', '\x9b', '\x81', '\x22', '\xf5', '\x20', '\x0f', '\x05', + '\x24', '\xe1', '\x6d', '\xda', '\x06', '\x31', '\xed', '\xda', + '\x1e', '\x30', '\x65', '\x56', '\x06', '\x30', '\x01', '\x42', + '\x81', '\x42', '\x81', '\x42', '\x65', '\x56', '\x0c', '\x30', + '\xe8', '\x46', '\x64', '\x46', '\x69', '\xa0', '\x64', '\x06', + '\x08', '\xe0', '\x63', '\xa6', '\x61', '\xb0', '\x64', '\x06', + '\x63', '\xa6', '\x4f', '\xbc', '\xf0', '\x00', '\x5f', '\xcc', + '\x55', '\x05', '\x3f', '\xbd', '\x66', '\x0c', '\x00', '\x38', + '\x12', '\xe0', '\x41', '\xa2', '\x4f', '\xbc', '\xf0', '\x00', + '\x5f', '\xcc', '\x55', '\x05', '\x3f', '\xbd', '\x66', '\x0c', + '\x00', '\x38', '\x7a', '\x86', '\xbe', '\x8f', '\x04', '\xe2', + '\x3e', '\x0d', '\xfc', '\xe1', '\x7e', '\xbe', '\x90', '\xe2', + '\xfe', '\x3b', '\x06', '\xa1', '\xa0', '\x0b', '\xff', '\x2d', + '\x16', '\x04', '\x6a', '\x26', '\x3f', '\xbd', '\x52', '\x0d', + '\x00', '\x38', '\x6a', '\xa6', '\xff', '\x2d', '\x86', '\x03', + '\x41', '\xa2', '\x62', '\xa6', '\x3f', '\xbd', '\xae', '\x0c', + '\x00', '\x38', '\x62', '\xa6', '\x4f', '\xbc', '\x90', '\x00', + '\x5f', '\xcc', '\x55', '\x05', '\x3f', '\xbd', '\x66', '\x0c', + '\x00', '\x38', '\x6f', '\x1e', '\x18', '\x0c', '\x00', '\x38', + '\x62', '\xa6', '\x7b', '\x86', '\xb1', '\xb9', '\x6a', '\x36', + '\x04', '\x21', '\x40', '\xbe', '\x4b', '\xb4', '\x2b', '\xb6', + '\x62', '\xa6', '\xb1', '\xb9', '\x42', '\x92', '\xc0', '\x9a', + '\x1c', '\x20', '\x63', '\xc6', '\xf0', '\xc3', '\x53', '\x94', + '\xe9', '\xc6', '\x14', '\x20', '\x63', '\x06', '\x6a', '\xd6', + '\xf0', '\xd3', '\x5a', '\x94', '\xe9', '\xd6', '\x0a', '\x20', + '\xd0', '\x03', '\x6c', '\x36', '\x6d', '\xa6', '\x63', '\x06', + '\xd0', '\x03', '\x6a', '\x07', '\x62', '\xa6', '\x4f', '\xbc', + '\xf0', '\x00', '\x5f', '\xcc', '\x55', '\x05', '\x3f', '\xbd', + '\x66', '\x0c', '\x00', '\x38', '\xef', '\x0e', '\xc0', '\x00', + '\x1f', '\x00', '\xff', '\x3d', '\x48', '\x02', '\x0f', '\x05', + '\x60', '\x90', '\x0f', '\x05', '\xef', '\x0e', '\xc4', '\x22', + '\x01', '\x00', '\xb0', '\x30', '\x0f', '\x05', '\x20', '\x90', + '\x0f', '\x05', '\xef', '\x0e', '\x58', '\x22', '\x01', '\x00', + '\xff', '\x3d', '\x5a', '\x01', '\x0f', '\x05', '\xef', '\x0e', + '\x5b', '\x22', '\x01', '\x00', '\xff', '\x3d', '\x4e', '\x01', + '\x0f', '\x05', '\xff', '\xed', '\xb6', '\x02', '\x0f', '\x05', + '\xef', '\x0e', '\xda', '\x22', '\x01', '\x00', '\xff', '\x3d', + '\x9c', '\x01', '\x0f', '\x05', '\x14', '\x90', '\x0f', '\x05', + '\xef', '\x0e', '\xd6', '\x22', '\x01', '\x00', '\xff', '\x3d', + '\x8c', '\x01', '\x0f', '\x05', '\xff', '\xed', '\x94', '\x02', + '\x0f', '\x05', '\xef', '\x0e', '\x49', '\x22', '\x04', '\x00', + '\xc4', '\x30', '\x0f', '\x05', '\xff', '\xed', '\x84', '\x02', + '\x0f', '\x05', '\xef', '\x0e', '\xd7', '\x00', '\x20', '\x00', + '\xff', '\x3d', '\x6a', '\x01', '\x0f', '\x05', '\x20', '\x90', + '\x0f', '\x05', '\xef', '\x0e', '\xc2', '\x00', '\x1f', '\x00', + '\xff', '\x3d', '\x00', '\x02', '\x0f', '\x05', '\xef', '\x0e', + '\xc9', '\x00', '\x1f', '\x00', '\xff', '\x3d', '\x18', '\x02', + '\x0f', '\x05', '\xff', '\xed', '\x56', '\x02', '\x0f', '\x05', + '\xef', '\x0e', '\x4f', '\x00', '\x98', '\x00', '\xff', '\x3d', + '\x3c', '\x01', '\x0f', '\x05', '\x12', '\x90', '\x0f', '\x05', + '\xef', '\x0e', '\x43', '\x00', '\x98', '\x00', '\x76', '\x30', + '\x0f', '\x05', '\xff', '\xed', '\x36', '\x02', '\x0f', '\x05', + '\xef', '\x0e', '\xc2', '\x00', '\x98', '\x00', '\xff', '\x2d', + '\x2a', '\x02', '\x0f', '\x05', '\x6f', '\x1e', '\x46', '\x1b', + '\x00', '\x38', '\x61', '\x1a', '\x6f', '\xde', '\x00', '\x00', + '\x20', '\x00', '\x06', '\x21', '\xed', '\xdb', '\x0c', '\x21', + '\x70', '\x8a', '\x6f', '\x9e', '\x00', '\x00', '\x01', '\x00', + '\x10', '\x21', '\xe9', '\x9b', '\x5f', '\xd2', '\x14', '\x21', + '\xed', '\xdb', '\x6f', '\x9e', '\x00', '\x00', '\x1f', '\x00', + '\x18', '\x21', '\xe9', '\x9b', '\x1f', '\xdc', '\xe1', '\x7f', + '\x1c', '\x21', '\xed', '\xdb', '\x41', '\x92', '\x20', '\x21', + '\xe9', '\x9b', '\x6f', '\xde', '\x00', '\x80', '\x1f', '\x00', + '\x24', '\x21', '\xed', '\xdb', '\x5f', '\xdc', '\x00', '\x20', + '\x28', '\x21', '\xed', '\xdb', '\x42', '\xd2', '\x2c', '\x21', + '\xed', '\xdb', '\x6f', '\xde', '\x00', '\xc0', '\x1f', '\x00', + '\xff', '\xed', '\x16', '\x01', '\x0f', '\x05', '\x6f', '\x1e', + '\x42', '\x1b', '\x00', '\x38', '\x61', '\x1a', '\x6f', '\x9e', + '\x00', '\x00', '\x20', '\x00', '\x06', '\x21', '\xe9', '\x9b', + '\x0c', '\x21', '\x70', '\x8a', '\x5f', '\x9c', '\x00', '\x40', + '\x10', '\x21', '\xe9', '\x9b', '\x41', '\xd2', '\x14', '\x21', + '\xed', '\xdb', '\x18', '\x21', '\xe9', '\x9b', '\x5f', '\x9c', + '\x00', '\x20', '\x1c', '\x21', '\xe9', '\x9b', '\x42', '\x92', + '\x20', '\x21', '\xe9', '\x9b', '\x1f', '\x9c', '\xfe', '\x7f', + '\x24', '\x21', '\xe9', '\x9b', '\x28', '\x21', '\xe9', '\x9b', + '\x2c', '\x21', '\xed', '\xdb', '\x6f', '\x9e', '\x00', '\x00', + '\x01', '\x00', '\x30', '\x21', '\xe9', '\x9b', '\x34', '\x21', + '\xe9', '\x9b', '\x58', '\xe0', '\x5f', '\xd2', '\x6f', '\x1e', + '\x3a', '\x1b', '\x00', '\x38', '\x61', '\x1a', '\x6f', '\x9e', + '\x00', '\x00', '\x10', '\x00', '\x06', '\x21', '\xe9', '\x9b', + '\x0c', '\x21', '\x70', '\x8a', '\x5f', '\x9c', '\x00', '\x40', + '\x10', '\x21', '\xe9', '\x9b', '\x41', '\xd2', '\x14', '\x21', + '\xed', '\xdb', '\x18', '\x21', '\xe9', '\x9b', '\x5f', '\x9c', + '\x00', '\x20', '\x1c', '\x21', '\xe9', '\x9b', '\x42', '\x92', + '\x20', '\x21', '\xe9', '\x9b', '\x1f', '\x9c', '\xfe', '\x7f', + '\x24', '\x21', '\xe9', '\x9b', '\x28', '\x21', '\xe9', '\x9b', + '\x2c', '\x21', '\xed', '\xdb', '\x6f', '\x9e', '\x00', '\x00', + '\x01', '\x00', '\x30', '\x21', '\xe9', '\x9b', '\x34', '\x21', + '\xe9', '\x9b', '\x4f', '\xd2', '\x38', '\x21', '\xed', '\xdb', + '\xff', '\xed', '\x3e', '\x01', '\x0f', '\x05', '\x6f', '\x1e', + '\x3e', '\x1b', '\x00', '\x38', '\x61', '\x1a', '\x6f', '\x9e', + '\x00', '\x00', '\x10', '\x00', '\x06', '\x21', '\xe9', '\x9b', + '\x0c', '\x21', '\x70', '\x8a', '\x6f', '\xde', '\x00', '\x00', + '\x01', '\x00', '\x10', '\x21', '\xed', '\xdb', '\x4f', '\x92', + '\x14', '\x21', '\xe9', '\x9b', '\x6f', '\xde', '\x00', '\x00', + '\x0f', '\x00', '\x18', '\x21', '\xed', '\xdb', '\x1f', '\x9c', + '\xf1', '\x7f', '\x1c', '\x21', '\xe9', '\x9b', '\x41', '\x92', + '\x20', '\x21', '\xe9', '\x9b', '\x6f', '\xde', '\x00', '\x80', + '\x0f', '\x00', '\x24', '\x21', '\xed', '\xdb', '\x5f', '\xdc', + '\x00', '\x20', '\x28', '\x21', '\xed', '\xdb', '\x42', '\xd2', + '\x2c', '\x21', '\xed', '\xdb', '\x6f', '\xde', '\x00', '\xc0', + '\x0f', '\x00', '\x30', '\x21', '\xed', '\xdb', '\x5f', '\xdc', + '\x00', '\x40', '\x34', '\x21', '\xed', '\xdb', '\x38', '\x21', + '\xe9', '\x9b', '\xce', '\xe0', '\x0f', '\x05', '\x6f', '\x1e', + '\x42', '\x1b', '\x00', '\x38', '\x61', '\x1a', '\x6f', '\x9e', + '\x00', '\x00', '\x20', '\x00', '\x06', '\x21', '\xe9', '\x9b', + '\x0c', '\x21', '\x70', '\x8a', '\x5f', '\xdc', '\x00', '\x20', + '\x10', '\x21', '\xed', '\xdb', '\x48', '\x92', '\x14', '\x21', + '\xe9', '\x9b', '\x6f', '\x9e', '\x00', '\x00', '\x01', '\x00', + '\x18', '\x21', '\xe9', '\x9b', '\x1c', '\x21', '\xe9', '\x9b', + '\x62', '\xe0', '\x5f', '\xd2', '\x6f', '\x1e', '\x46', '\x1b', + '\x00', '\x38', '\x61', '\x1a', '\x6f', '\x9e', '\x00', '\x00', + '\x20', '\x00', '\x06', '\x21', '\xe9', '\x9b', '\x0c', '\x21', + '\x70', '\x8a', '\x6f', '\xde', '\x00', '\x00', '\x01', '\x00', + '\x10', '\x21', '\xed', '\xdb', '\x26', '\xe0', '\x5f', '\x92', + '\x6f', '\x1e', '\x4a', '\x1b', '\x00', '\x38', '\x61', '\x1a', + '\x6f', '\x9e', '\x00', '\x00', '\x40', '\x00', '\x06', '\x21', + '\xe9', '\x9b', '\x0c', '\x21', '\x70', '\x8a', '\x6f', '\xde', + '\x00', '\x00', '\x01', '\x00', '\x10', '\x21', '\xed', '\xdb', + '\x4f', '\x9c', '\x3f', '\x00', '\x14', '\x21', '\xe9', '\x9b', + '\x6f', '\xde', '\x00', '\x00', '\x1f', '\x00', '\x18', '\x21', + '\xed', '\xdb', '\x5f', '\x9c', '\x00', '\x20', '\x1c', '\x21', + '\xe9', '\x9b', '\x48', '\xd2', '\x20', '\x21', '\xed', '\xdb', + '\x30', '\xe0', '\x0f', '\x05', '\x04', '\x21', '\x49', '\x9a', + '\x6f', '\xae', '\x7e', '\x1a', '\x00', '\x38', '\xcf', '\x9e', + '\x01', '\x00', '\x08', '\x30', '\x0f', '\x05', '\x6f', '\xae', + '\x90', '\x1a', '\x00', '\x38', '\x3f', '\xbd', '\x1a', '\x05', + '\x00', '\x38', '\x62', '\xaa', '\x41', '\xb2', '\x3f', '\xbd', + '\x60', '\x05', '\x00', '\x38', '\x7a', '\x86', '\xbe', '\x3f', + '\x3e', '\x0d', '\x6f', '\x3e', '\x1a', '\x05', '\x00', '\x38', + '\x6f', '\xae', '\xa8', '\x1a', '\x00', '\x38', '\xb3', '\xb9', + '\x04', '\x21', '\x40', '\x9e', '\xcf', '\x9e', '\x01', '\x00', + '\x0c', '\x20', '\x42', '\xd2', '\x6f', '\xae', '\xb0', '\x1a', + '\x00', '\x38', '\xb3', '\xb9', '\x42', '\xd2', '\xc0', '\xda', + '\x32', '\x20', '\x47', '\xc2', '\x06', '\x21', '\x6d', '\x9e', + '\xc1', '\x93', '\xed', '\x9b', '\x62', '\xd6', '\x0c', '\xd1', + '\x69', '\x9a', '\xc1', '\x93', '\x0c', '\xd1', '\xe9', '\x9b', + '\x10', '\xd1', '\x69', '\x9a', '\xc1', '\x93', '\x10', '\xd1', + '\xe9', '\x9b', '\x81', '\xc2', '\xe9', '\x60', '\x0c', '\xd2', + '\x6f', '\xae', '\xb2', '\x1a', '\x00', '\x38', '\x3f', '\xbd', + '\x1a', '\x05', '\x00', '\x38', '\x6f', '\x0e', '\x1a', '\x05', + '\x00', '\x38', '\x6f', '\xae', '\xb4', '\x1a', '\x00', '\x38', + '\xb0', '\xb9', '\x61', '\xa6', '\xb0', '\xb9', '\x6f', '\xae', + '\xe6', '\x19', '\x00', '\x38', '\xb0', '\xb9', '\x62', '\xaa', + '\x41', '\xb2', '\x3f', '\xbd', '\x60', '\x05', '\x00', '\x38', + '\x41', '\xa2', '\xbe', '\x3f', '\x3e', '\x0d', '\xfc', '\xe1', + '\x7e', '\xbe', '\x8c', '\xe2', '\xfe', '\x2b', '\x6a', '\x16', + '\x6b', '\x26', '\x6f', '\x0e', '\xae', '\x0c', '\x00', '\x38', + '\xb0', '\xb9', '\x61', '\xa6', '\x4f', '\xbc', '\x80', '\x00', + '\x5f', '\xcc', '\x55', '\x05', '\x3f', '\xbd', '\x66', '\x0c', + '\x00', '\x38', '\x61', '\xa6', '\xb0', '\xb9', '\x04', '\x11', + '\x49', '\x9a', '\xcf', '\x9e', '\x02', '\x00', '\x10', '\x20', + '\x0f', '\x05', '\x6f', '\x9e', '\x30', '\x00', '\x30', '\x00', + '\x61', '\x29', '\xe9', '\x9b', '\xbe', '\x2f', '\x3e', '\x0d', + '\x4f', '\x9c', '\x30', '\x00', '\x61', '\x29', '\xd9', '\x9b', + '\xbe', '\x2f', '\x3e', '\x0d', '\x84', '\xe2', '\xfe', '\x0b', + '\x06', '\xa1', '\xeb', '\xba', '\x10', '\x10', '\x0f', '\x05', + '\x7a', '\x86', '\x7f', '\xb6', '\xbe', '\x0f', '\x10', '\xa1', + '\x6a', '\xaa', '\x7f', '\xb6', '\xbe', '\x0f', '\x70', '\x86', + '\x0c', '\xa1', '\xeb', '\xba', '\x22', '\x10', '\x7d', '\x86', + '\x14', '\xa1', '\xed', '\xda', '\x10', '\x00', '\x79', '\x86', + '\x10', '\xa1', '\x6c', '\xca', '\x01', '\x92', '\x14', '\xa1', + '\xe9', '\x9a', '\xf9', '\x10', '\x2c', '\xd6', '\x0c', '\xa1', + '\x29', '\xda', '\xe9', '\xb6', '\xd1', '\x10', '\x0f', '\x05', + '\x01', '\x02', '\xc7', '\x02', '\xd3', '\x80', '\x0c', '\xa2', + '\x7a', '\x86', '\x7f', '\xb6', '\xbe', '\x0f', '\x84', '\xe2', + '\xfe', '\x0b', '\x6a', '\x06', '\x6b', '\xa6', '\x6d', '\xb6', + '\x7d', '\x86', '\xeb', '\xd6', '\x48', '\xa0', '\x0f', '\x05', + '\x60', '\x9a', '\x2d', '\x96', '\x49', '\xa5', '\x59', '\x9a', + '\x4c', '\xd5', '\xd9', '\x9a', '\x32', '\x30', '\x02', '\xd2', + '\x82', '\xd2', '\x6b', '\x96', '\x2a', '\x96', '\xe9', '\xa6', + '\x20', '\x00', '\x6a', '\xc6', '\x60', '\xc9', '\x59', '\x9a', + '\xdf', '\x9e', '\xff', '\xff', '\x0a', '\x30', '\x02', '\xc2', + '\x82', '\xc2', '\x42', '\xa2', '\x7f', '\xb6', '\xbe', '\x0f', + '\x6b', '\x96', '\x2a', '\x96', '\xe9', '\xc6', '\xe5', '\x10', + '\x0f', '\x05', '\x41', '\xa2', '\x7f', '\xb6', '\xbe', '\x0f', + '\xeb', '\xd6', '\xbd', '\xb0', '\x0f', '\x05', '\x7a', '\x86', + '\x7f', '\xb6', '\xbe', '\x0f', '\xfc', '\xe1', '\x7e', '\xbe', + '\x90', '\xe2', '\xfe', '\x3b', '\x73', '\x86', '\x72', '\x86', + '\x6f', '\x0e', '\x4e', '\x1b', '\x00', '\x38', '\x41', '\x12', + '\x04', '\x01', '\xc1', '\x1b', '\xcf', '\x1e', '\x01', '\x00', + '\x04', '\x30', '\x42', '\x92', '\x44', '\x92', '\x05', '\x01', + '\xc9', '\x9b', '\x60', '\xa6', '\x3f', '\xbd', '\x42', '\x0f', + '\x00', '\x38', '\x6a', '\xa6', '\x0c', '\x20', '\x0f', '\x05', + '\xc1', '\x13', '\xcf', '\x1e', '\x03', '\x00', '\xd9', '\x80', + '\x0f', '\x05', '\x06', '\x01', '\x23', '\x3a', '\x0f', '\x0c', + '\x6c', '\x00', '\x01', '\x22', '\xc1', '\x22', '\xc7', '\x80', + '\x63', '\xa6', '\xbe', '\x3f', '\x3e', '\x0d', '\xfc', '\xe1', + '\x7e', '\xbe', '\x98', '\xe2', '\xfe', '\x5b', '\x6a', '\x16', + '\x6b', '\x56', '\x6c', '\x36', '\x70', '\x86', '\xed', '\x06', + '\x74', '\xa0', '\x6d', '\x46', '\x05', '\x11', '\x49', '\x9a', + '\xcf', '\x9e', '\x02', '\x00', '\x12', '\x20', '\x0f', '\x05', + '\x43', '\x05', '\x59', '\x9a', '\xdf', '\x9e', '\xff', '\xff', + '\x54', '\x30', '\x42', '\x22', '\x05', '\x11', '\x49', '\x9a', + '\xcf', '\x9e', '\x04', '\x00', '\x0e', '\x20', '\x61', '\xa6', + '\x43', '\x05', '\x69', '\x9a', '\xff', '\x92', '\x3e', '\x30', + '\x44', '\x22', '\x61', '\xa6', '\x3f', '\xbd', '\xae', '\x0c', + '\x00', '\x38', '\x61', '\xa6', '\x4f', '\xbc', '\xa0', '\x00', + '\x5f', '\xcc', '\x55', '\x05', '\x3f', '\xbd', '\x66', '\x0c', + '\x00', '\x38', '\x65', '\xb6', '\x20', '\xb6', '\x63', '\xc6', + '\x20', '\xc6', '\x61', '\xa6', '\x3f', '\xbd', '\x3a', '\x0c', + '\x00', '\x38', '\x6a', '\x26', '\x61', '\xa6', '\x65', '\xb6', + '\x20', '\xb6', '\x3f', '\xbd', '\xda', '\x0c', '\x00', '\x38', + '\x6a', '\xa6', '\xf3', '\x20', '\x61', '\xa6', '\x22', '\x06', + '\xe4', '\x06', '\x91', '\xb0', '\x0f', '\x05', '\xbe', '\x5f', + '\x3e', '\x0d', '\xfc', '\xe1', '\x7e', '\xbe', '\xa4', '\xe2', + '\xfe', '\x8b', '\x6a', '\x16', '\x6b', '\x06', '\x6c', '\x86', + '\x3f', '\xbd', '\x6c', '\x14', '\x00', '\x38', '\x6a', '\x96', + '\x1a', '\x30', '\x41', '\xa2', '\x60', '\xd6', '\x28', '\xd6', + '\xe9', '\xd6', '\x14', '\x80', '\x0f', '\x05', '\x6f', '\xae', + '\xb8', '\x1a', '\x00', '\x38', '\x3f', '\xbd', '\x1a', '\x05', + '\x00', '\x38', '\x42', '\xa2', '\xbe', '\x8f', '\x3e', '\x0d', + '\x6f', '\xce', '\x54', '\x1b', '\x00', '\x38', '\x6c', '\xca', + '\xec', '\x06', '\x1e', '\x10', '\xec', '\xd6', '\x6f', '\x9e', + '\x26', '\x1c', '\x00', '\x38', '\x09', '\x91', '\x70', '\x8a', + '\x16', '\x91', '\xe1', '\x1b', '\xac', '\x06', '\x1a', '\x91', + '\xe0', '\x0b', '\x1e', '\x91', '\xe8', '\x8b', '\x74', '\xe0', + '\x0f', '\x05', '\x5a', '\x80', '\x6c', '\x96', '\x6f', '\xde', + '\x26', '\x1c', '\x00', '\x38', '\x01', '\xd1', '\xe1', '\x1b', + '\x05', '\xd1', '\xe0', '\x0b', '\xa0', '\x96', '\x09', '\xd1', + '\xe9', '\x9b', '\x29', '\x16', '\x16', '\xd1', '\xe1', '\x1b', + '\x1a', '\xd1', '\x70', '\x8a', '\x68', '\xc6', '\xa9', '\xc6', + '\x1e', '\xd1', '\xec', '\xcb', '\x46', '\xe0', '\x0f', '\x05', + '\x6f', '\xae', '\xd4', '\x1a', '\x00', '\x38', '\x3f', '\xbd', + '\x1a', '\x05', '\x00', '\x38', '\x44', '\xa2', '\xbe', '\x8f', + '\x3e', '\x0d', '\x6f', '\xae', '\xe8', '\x1a', '\x00', '\x38', + '\x3f', '\xbd', '\x1a', '\x05', '\x00', '\x38', '\x60', '\xa6', + '\x41', '\xb2', '\x3f', '\xbd', '\x60', '\x05', '\x00', '\x38', + '\x43', '\xa2', '\xbe', '\x8f', '\x3e', '\x0d', '\x6f', '\x9e', + '\x26', '\x1c', '\x00', '\x38', '\x01', '\x91', '\xe1', '\x1b', + '\x05', '\x91', '\xe0', '\x0b', '\x09', '\x91', '\xe8', '\x8b', + '\x1e', '\x91', '\x70', '\x8a', '\x6f', '\xce', '\x26', '\x1c', + '\x00', '\x38', '\x7c', '\x0a', '\x0d', '\xc1', '\x70', '\x8a', + '\x11', '\xc1', '\x70', '\x8a', '\x15', '\xc1', '\x79', '\x0e', + '\x7f', '\x0d', '\x48', '\x1c', '\x00', '\x38', '\x70', '\x8a', + '\x7f', '\x0d', '\x4c', '\x1c', '\x00', '\x38', '\x70', '\x8a', + '\x0d', '\x91', '\xe8', '\x8a', '\xff', '\x8d', '\xc0', '\x01', + '\x75', '\x86', '\x65', '\x56', '\x04', '\x20', '\x6c', '\xd6', + '\x15', '\xd2', '\x65', '\x96', '\x29', '\x55', '\x65', '\x36', + '\x23', '\x95', '\x09', '\xd1', '\x69', '\x9a', '\x24', '\x30', + '\x2c', '\x36', '\x0d', '\xd1', '\xe9', '\x9a', '\x1c', '\x80', + '\x0f', '\x05', '\x09', '\x31', '\x69', '\x9a', '\x10', '\x30', + '\x0f', '\x05', '\x83', '\x0b', '\x0a', '\x20', '\x0f', '\x05', + '\x0d', '\x31', '\xe9', '\x9a', '\x06', '\x20', '\x0f', '\x05', + '\x65', '\x56', '\x35', '\x35', '\x11', '\x31', '\x63', '\x3a', + '\xca', '\x32', '\x4d', '\x90', '\x65', '\x96', '\x29', '\x55', + '\x65', '\x36', '\x23', '\x95', '\x2f', '\x3e', '\x26', '\x1c', + '\x00', '\x38', '\x05', '\x31', '\x64', '\x4a', '\x0d', '\x31', + '\x69', '\x9a', '\x29', '\x46', '\x01', '\x31', '\x27', '\x9a', + '\x65', '\xa6', '\xc3', '\xa3', '\xa5', '\xa6', '\xc2', '\xa3', + '\xa5', '\xa6', '\xc2', '\xa3', '\x2f', '\xae', '\x4e', '\x1b', + '\x00', '\x38', '\x64', '\xb6', '\x3f', '\xbd', '\xbc', '\x13', + '\x00', '\x38', '\x83', '\x0b', '\x24', '\x30', '\x6a', '\x66', + '\x65', '\xa6', '\xc3', '\xa3', '\xa5', '\xa6', '\xc2', '\xa3', + '\xa5', '\xa6', '\xc2', '\xa3', '\x2f', '\xae', '\x4e', '\x1b', + '\x00', '\x38', '\x64', '\xb6', '\x3f', '\xbd', '\xda', '\x0c', + '\x00', '\x38', '\x6a', '\xa6', '\xe5', '\x20', '\x65', '\xa6', + '\x73', '\x0a', '\x65', '\x26', '\xc3', '\x23', '\xa5', '\x26', + '\xc2', '\x23', '\xa5', '\x26', '\xc2', '\x23', '\x2f', '\x2e', + '\x4e', '\x1b', '\x00', '\x38', '\x62', '\xa6', '\x4f', '\xbc', + '\xf0', '\x00', '\x5f', '\xcc', '\x55', '\x05', '\x3f', '\xbd', + '\x66', '\x0c', '\x00', '\x38', '\x62', '\xa6', '\x64', '\xb6', + '\x67', '\xc6', '\x66', '\xd6', '\x3f', '\xbd', '\x0e', '\x14', + '\x00', '\x38', '\x4a', '\xa6', '\x28', '\x20', '\x7b', '\x86', + '\x0d', '\x31', '\x69', '\xde', '\x26', '\xd6', '\xe9', '\xdb', + '\x11', '\x31', '\x70', '\x8a', '\x62', '\xaa', '\x24', '\xa6', + '\x3f', '\xbd', '\x60', '\x05', '\x00', '\x38', '\x6f', '\xae', + '\xf2', '\x1a', '\x00', '\x38', '\x3f', '\xbd', '\x1a', '\x05', + '\x00', '\x38', '\xaa', '\xe0', '\x0f', '\x05', '\xcf', '\xae', + '\x01', '\x00', '\x4c', '\x30', '\x0f', '\x05', '\xcf', '\xae', + '\x02', '\x00', '\x46', '\x20', '\x65', '\xa6', '\x62', '\xaa', + '\x24', '\xa6', '\x6f', '\x1e', '\x60', '\x05', '\x00', '\x38', + '\x7b', '\x86', '\xb1', '\xb9', '\x6f', '\x0e', '\x1a', '\x05', + '\x00', '\x38', '\x6f', '\xae', '\x06', '\x1b', '\x00', '\x38', + '\xb0', '\xb9', '\x66', '\xa6', '\x7b', '\x86', '\xb1', '\xb9', + '\x6f', '\xae', '\x12', '\x1b', '\x00', '\x38', '\xb0', '\xb9', + '\x62', '\xa6', '\x64', '\xb6', '\x3f', '\xbd', '\x6e', '\x13', + '\x00', '\x38', '\x41', '\x92', '\xc3', '\x9b', '\x11', '\x31', + '\x6d', '\x9e', '\x01', '\x92', '\x58', '\xe0', '\xed', '\x9b', + '\x65', '\xa6', '\xc3', '\xa3', '\xa5', '\xa6', '\xc2', '\xa3', + '\xa5', '\xa6', '\xc2', '\xa3', '\x6f', '\xad', '\x4e', '\x1b', + '\x00', '\x38', '\x62', '\xae', '\x24', '\xa6', '\x6f', '\x1e', + '\x60', '\x05', '\x00', '\x38', '\x7b', '\x86', '\xb1', '\xb9', + '\x6f', '\x0e', '\x1a', '\x05', '\x00', '\x38', '\x6f', '\xae', + '\x1a', '\x1b', '\x00', '\x38', '\xb0', '\xb9', '\x66', '\xa6', + '\x7b', '\x86', '\xb1', '\xb9', '\x6f', '\xae', '\x12', '\x1b', + '\x00', '\x38', '\xb0', '\xb9', '\x62', '\xa6', '\x64', '\xb6', + '\x67', '\xc6', '\x66', '\xd6', '\x3f', '\xbd', '\xbe', '\x14', + '\x00', '\x38', '\x0d', '\x31', '\x6d', '\x9e', '\x26', '\x96', + '\xed', '\x9b', '\x11', '\x31', '\x70', '\x8a', '\x6f', '\xce', + '\x26', '\x1c', '\x00', '\x38', '\x0d', '\xc1', '\x69', '\x9a', + '\x7f', '\x0d', '\x48', '\x1c', '\x00', '\x38', '\x29', '\x9a', + '\xe8', '\x96', '\xff', '\x1d', '\x44', '\xfe', '\x0f', '\x05', + '\x75', '\x86', '\x6f', '\x2e', '\x4e', '\x1b', '\x00', '\x38', + '\x6f', '\x1e', '\x26', '\x1c', '\x00', '\x38', '\x09', '\x11', + '\xa0', '\x0b', '\x4c', '\x30', '\x7b', '\x86', '\x62', '\xaa', + '\x3f', '\xbd', '\x60', '\x05', '\x00', '\x38', '\x6f', '\xae', + '\x26', '\x1b', '\x00', '\x38', '\x3f', '\xbd', '\x1a', '\x05', + '\x00', '\x38', '\x70', '\x86', '\x09', '\x11', '\xe0', '\x0a', + '\x22', '\x00', '\x0f', '\x05', '\x05', '\x11', '\x29', '\x0a', + '\x01', '\x11', '\x6d', '\xda', '\x62', '\x99', '\x59', '\x9a', + '\x4d', '\x05', '\xd9', '\x9a', '\xff', '\x2d', '\x9a', '\xfd', + '\x0f', '\x05', '\x02', '\x02', '\x09', '\x11', '\xe0', '\x0a', + '\xe3', '\x10', '\x0f', '\x05', '\x6f', '\xae', '\x36', '\x1b', + '\x00', '\x38', '\x3f', '\xbd', '\x1a', '\x05', '\x00', '\x38', + '\x0f', '\x2c', '\x6c', '\x00', '\x01', '\x52', '\xc1', '\x52', + '\xa5', '\x80', '\x15', '\x12', '\x7a', '\x86', '\xbe', '\x8f', + '\x3e', '\x0d', '\x00', '\x00', '\x7f', '\xb6', '\x0f', '\x05', + '\x00', '\x00', '\x00', '\x00', '\x0d', '\x0a', '\x0d', '\x0a', + '\x44', '\x65', '\x76', '\x69', '\x63', '\x65', '\x20', '\x49', + '\x44', '\x20', '\x3d', '\x20', '\x00', '\x00', '\x43', '\x68', + '\x65', '\x63', '\x6b', '\x73', '\x75', '\x6d', '\x20', '\x6f', + '\x66', '\x20', '\x62', '\x6f', '\x6f', '\x74', '\x6c', '\x6f', + '\x61', '\x64', '\x65', '\x72', '\x20', '\x69', '\x73', '\x20', + '\x00', '\x00', '\x57', '\x61', '\x69', '\x74', '\x69', '\x6e', + '\x67', '\x20', '\x66', '\x6f', '\x72', '\x20', '\x6c', '\x6f', + '\x61', '\x64', '\x20', '\x69', '\x6e', '\x66', '\x6f', '\x2e', + '\x0d', '\x0a', '\x00', '\x00', '\x47', '\x6f', '\x74', '\x20', + '\x6c', '\x6f', '\x61', '\x64', '\x20', '\x69', '\x6e', '\x66', + '\x6f', '\x2e', '\x0d', '\x0a', '\x00', '\x00', '\x50', '\x41', + '\x43', '\x4b', '\x45', '\x54', '\x5f', '\x49', '\x4e', '\x46', + '\x4f', '\x0d', '\x0a', '\x00', '\x53', '\x45', '\x54', '\x5f', + '\x52', '\x45', '\x47', '\x49', '\x53', '\x54', '\x45', '\x52', + '\x0d', '\x0a', '\x00', '\x00', '\x47', '\x45', '\x54', '\x5f', + '\x52', '\x45', '\x47', '\x49', '\x53', '\x54', '\x45', '\x52', + '\x0d', '\x0a', '\x00', '\x00', '\x50', '\x41', '\x55', '\x53', + '\x45', '\x5f', '\x4c', '\x4f', '\x4f', '\x50', '\x0d', '\x0a', + '\x00', '\x00', '\x4d', '\x45', '\x4d', '\x5f', '\x56', '\x45', + '\x52', '\x49', '\x46', '\x59', '\x0d', '\x0a', '\x00', '\x00', + '\x76', '\x65', '\x72', '\x69', '\x66', '\x79', '\x20', '\x66', + '\x61', '\x69', '\x6c', '\x65', '\x64', '\x0d', '\x0a', '\x00', + '\x4d', '\x45', '\x4d', '\x5f', '\x54', '\x45', '\x53', '\x54', + '\x0d', '\x0a', '\x00', '\x00', '\x23', '\x23', '\x23', '\x20', + '\x4d', '\x65', '\x6d', '\x6f', '\x72', '\x79', '\x20', '\x74', + '\x65', '\x73', '\x74', '\x20', '\x66', '\x61', '\x69', '\x6c', + '\x65', '\x64', '\x20', '\x61', '\x74', '\x20', '\x00', '\x00', + '\x50', '\x61', '\x73', '\x73', '\x65', '\x64', '\x20', '\x6d', + '\x65', '\x6d', '\x6f', '\x72', '\x79', '\x20', '\x74', '\x65', + '\x73', '\x74', '\x2e', '\x0d', '\x0a', '\x00', '\x4d', '\x45', + '\x4d', '\x5f', '\x44', '\x55', '\x4d', '\x50', '\x0d', '\x0a', + '\x00', '\x00', '\x4d', '\x45', '\x4d', '\x5f', '\x43', '\x4c', + '\x45', '\x41', '\x52', '\x0d', '\x0a', '\x00', '\x46', '\x4c', + '\x41', '\x53', '\x48', '\x0d', '\x0a', '\x00', '\x4a', '\x55', + '\x4d', '\x50', '\x0d', '\x0a', '\x00', '\x00', '\x45', '\x4e', + '\x44', '\x0d', '\x0a', '\x00', '\x23', '\x23', '\x23', '\x20', + '\x55', '\x6e', '\x6b', '\x6e', '\x6f', '\x77', '\x6e', '\x20', + '\x74', '\x79', '\x70', '\x65', '\x3a', '\x20', '\x00', '\x00', + '\x43', '\x68', '\x65', '\x63', '\x6b', '\x73', '\x75', '\x6d', + '\x20', '\x6f', '\x66', '\x20', '\x66', '\x69', '\x6c', '\x65', + '\x20', '\x69', '\x73', '\x20', '\x00', '\x00', '\x23', '\x23', + '\x23', '\x20', '\x4d', '\x65', '\x6d', '\x6f', '\x72', '\x79', + '\x20', '\x74', '\x65', '\x73', '\x74', '\x20', '\x31', '\x20', + '\x66', '\x61', '\x69', '\x6c', '\x65', '\x64', '\x20', '\x61', + '\x74', '\x20', '\x00', '\x00', '\x23', '\x23', '\x23', '\x20', + '\x4d', '\x65', '\x6d', '\x6f', '\x72', '\x79', '\x20', '\x74', + '\x65', '\x73', '\x74', '\x20', '\x32', '\x20', '\x66', '\x61', + '\x69', '\x6c', '\x65', '\x64', '\x20', '\x61', '\x74', '\x20', + '\x00', '\x00', '\x20', '\x3a', '\x00', '\x00', '\x38', '\x4d', + '\x62', '\x20', '\x42', '\x42', '\x00', '\x00', '\x38', '\x4d', + '\x62', '\x20', '\x54', '\x42', '\x00', '\x00', '\x31', '\x36', + '\x4d', '\x62', '\x20', '\x42', '\x42', '\x00', '\x31', '\x36', + '\x4d', '\x62', '\x20', '\x54', '\x42', '\x00', '\x33', '\x32', + '\x4d', '\x62', '\x20', '\x54', '\x42', '\x00', '\x55', '\x6e', + '\x73', '\x75', '\x70', '\x70', '\x6f', '\x72', '\x74', '\x65', + '\x64', '\x20', '\x69', '\x6e', '\x74', '\x65', '\x72', '\x6c', + '\x65', '\x61', '\x76', '\x65', '\x21', '\x0a', '\x00', '\x00', + '\x46', '\x6f', '\x75', '\x6e', '\x64', '\x20', '\x31', '\x20', + '\x78', '\x20', '\x43', '\x46', '\x49', '\x20', '\x61', '\x74', + '\x20', '\x00', '\x54', '\x6f', '\x6f', '\x20', '\x6d', '\x61', + '\x6e', '\x79', '\x20', '\x72', '\x65', '\x67', '\x69', '\x6f', + '\x6e', '\x73', '\x20', '\x6f', '\x6e', '\x20', '\x63', '\x68', + '\x69', '\x70', '\x21', '\x0a', '\x00', '\x00', '\x4e', '\x6f', + '\x20', '\x73', '\x69', '\x6e', '\x67', '\x6c', '\x65', '\x20', + '\x78', '\x31', '\x36', '\x20', '\x61', '\x74', '\x20', '\x00', + '\x4e', '\x6f', '\x20', '\x69', '\x6e', '\x74', '\x65', '\x72', + '\x6c', '\x65', '\x61', '\x76', '\x65', '\x64', '\x20', '\x78', + '\x31', '\x36', '\x20', '\x61', '\x74', '\x20', '\x00', '\x00', + '\x46', '\x6f', '\x75', '\x6e', '\x64', '\x20', '\x00', '\x00', + '\x31', '\x00', '\x32', '\x00', '\x20', '\x78', '\x20', '\x00', + '\x46', '\x61', '\x74', '\x61', '\x6c', '\x3a', '\x20', '\x66', + '\x6c', '\x61', '\x73', '\x68', '\x20', '\x69', '\x73', '\x20', + '\x74', '\x6f', '\x6f', '\x20', '\x73', '\x6d', '\x61', '\x6c', + '\x6c', '\x2e', '\x0a', '\x00', '\x53', '\x65', '\x63', '\x74', + '\x6f', '\x72', '\x20', '\x65', '\x72', '\x61', '\x73', '\x65', + '\x20', '\x65', '\x72', '\x72', '\x6f', '\x72', '\x0a', '\x00', + '\x45', '\x72', '\x72', '\x6f', '\x72', '\x20', '\x61', '\x74', + '\x20', '\x00', '\x3a', '\x20', '\x4e', '\x6f', '\x20', '\x6e', + '\x65', '\x65', '\x64', '\x20', '\x74', '\x6f', '\x20', '\x77', + '\x72', '\x69', '\x74', '\x65', '\x0a', '\x00', '\x3a', '\x20', + '\x45', '\x72', '\x61', '\x73', '\x69', '\x6e', '\x67', '\x20', + '\x00', '\x00', '\x20', '\x62', '\x79', '\x74', '\x65', '\x73', + '\x0a', '\x00', '\x3a', '\x20', '\x57', '\x72', '\x69', '\x74', + '\x69', '\x6e', '\x67', '\x20', '\x00', '\x00', '\x3a', '\x20', + '\x56', '\x65', '\x72', '\x69', '\x66', '\x79', '\x69', '\x6e', + '\x67', '\x2e', '\x2e', '\x2e', '\x00', '\x00', '\x4f', '\x4b', + '\x0a', '\x00', '\x0e', '\x1a', '\x00', '\x38', '\x16', '\x1a', + '\x00', '\x38', '\x1e', '\x1a', '\x00', '\x38', '\x26', '\x1a', + '\x00', '\x38', '\x2e', '\x1a', '\x00', '\x38', '\x00', '\x00', + '\x00', '\x80', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x84', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x54', '\x68', '\x69', '\x73', '\x20', '\x62', '\x6f', '\x6f', + '\x74', '\x6c', '\x6f', '\x61', '\x64', '\x65', '\x72', '\x20', + '\x77', '\x61', '\x73', '\x20', '\x62', '\x75', '\x69', '\x6c', + '\x74', '\x20', '\x62', '\x79', '\x20', '\x72', '\x6f', '\x6f', + '\x74', '\x20', '\x6f', '\x6e', '\x20', '\x57', '\x65', '\x64', + '\x20', '\x4d', '\x61', '\x79', '\x20', '\x31', '\x36', '\x20', + '\x32', '\x31', '\x3a', '\x33', '\x31', '\x3a', '\x34', '\x31', + '\x20', '\x43', '\x45', '\x53', '\x54', '\x20', '\x32', '\x30', + '\x30', '\x37', '\x2e', '\x0d', '\x0a', '\x00' +}; diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/net_noleds_ima.c b/target/linux/etrax-2.6/image/e100boot/src/sbl/net_noleds_ima.c new file mode 100644 index 0000000000..d5e03d1f29 --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/net_noleds_ima.c @@ -0,0 +1,873 @@ + +/* cconv 1.2 12/16/97, Copyright (C) 1997, Axis Communications AB */ + +const char net_noleds_ima[] = +{ + '\x0f', '\x05', '\x0f', '\x05', '\x6f', '\xee', '\x00', '\x1f', + '\x00', '\x38', '\x3f', '\x0d', '\x08', '\x01', '\x00', '\x38', + '\x78', '\x56', '\x34', '\x12', '\x21', '\x43', '\x65', '\x87', + '\x6f', '\xde', '\x20', '\x00', '\x00', '\xb0', '\x5f', '\x9c', + '\x65', '\x6f', '\xed', '\x9b', '\x5f', '\x9c', '\x25', '\x2f', + '\x7f', '\x0d', '\xf0', '\x17', '\x00', '\x38', '\xe9', '\x9b', + '\xed', '\x9b', '\x3f', '\x0d', '\x28', '\x01', '\x00', '\x38', + '\xfc', '\xe1', '\x7e', '\xbe', '\x7f', '\x0d', '\x92', '\x1c', + '\x00', '\x38', '\x70', '\x8a', '\x6f', '\x9e', '\x20', '\x00', + '\x00', '\xb0', '\x69', '\x9a', '\x79', '\x67', '\x7f', '\x0d', + '\x46', '\x1c', '\x00', '\x38', '\xe9', '\x9b', '\x6f', '\x9e', + '\x22', '\x00', '\x00', '\xb0', '\x59', '\x9a', '\x59', '\x94', + '\x7f', '\x0d', '\xae', '\x1c', '\x00', '\x38', '\xe9', '\x9b', + '\x6f', '\x9e', '\x04', '\x00', '\x00', '\xb0', '\x69', '\x9a', + '\x06', '\x93', '\xe1', '\x93', '\x81', '\x92', '\x7f', '\x0d', + '\x96', '\x1c', '\x00', '\x38', '\xc9', '\x9b', '\x7f', '\x0d', + '\x58', '\x1c', '\x00', '\x38', '\x70', '\x4a', '\x3f', '\xbd', + '\x28', '\x02', '\x00', '\x38', '\x3f', '\xbd', '\x30', '\x04', + '\x00', '\x38', '\x3f', '\xbd', '\xcc', '\x01', '\x00', '\x38', + '\x6a', '\xa6', '\xf7', '\x30', '\x0f', '\x05', '\x6f', '\x9e', + '\x00', '\x01', '\x00', '\x38', '\x69', '\x9a', '\x7f', '\x0d', + '\x92', '\x1c', '\x00', '\x38', '\xe9', '\x9a', '\x24', '\x80', + '\x0f', '\x05', '\x6f', '\x9e', '\x96', '\x1c', '\x00', '\x38', + '\x49', '\x9a', '\xcf', '\x9e', '\x01', '\x00', '\xd3', '\x20', + '\x0f', '\x05', '\x6f', '\xde', '\xd4', '\x01', '\x00', '\xb0', + '\x4d', '\x9a', '\x38', '\x93', '\x41', '\x93', '\xcd', '\x9b', + '\xc1', '\xe0', '\x0f', '\x05', '\x3e', '\xbe', '\x3f', '\x0d', + '\x80', '\x05', '\x00', '\x38', '\xfc', '\xe1', '\x7e', '\xbe', + '\x3f', '\xbd', '\x62', '\x03', '\x00', '\x38', '\x6a', '\xa6', + '\x16', '\x20', '\x41', '\x92', '\x3f', '\xbd', '\xf4', '\x01', + '\x00', '\x38', '\x6a', '\xa6', '\x0a', '\x30', '\x79', '\x86', + '\x3f', '\xbd', '\x30', '\x04', '\x00', '\x38', '\x79', '\x86', + '\x69', '\xa6', '\x3e', '\x0d', '\x84', '\xe2', '\x6f', '\x9e', + '\x22', '\x00', '\x00', '\xb0', '\x59', '\x9a', '\x59', '\x94', + '\xee', '\x9b', '\x6f', '\xce', '\xae', '\x1c', '\x00', '\x38', + '\x6c', '\x9a', '\x6e', '\xda', '\xad', '\x96', '\xb9', '\x96', + '\xdf', '\x9c', '\x80', '\x25', '\x0a', '\xd0', '\x0f', '\x05', + '\x6e', '\x9a', '\xec', '\x9b', '\x04', '\xe0', '\x41', '\xa2', + '\x7a', '\x86', '\x7f', '\xb6', '\x04', '\xe2', '\x00', '\x00', + '\x88', '\xe2', '\xfe', '\x1b', '\x6f', '\x9e', '\x8c', '\x00', + '\x00', '\xb0', '\x79', '\x8a', '\x69', '\x9a', '\x7f', '\x0d', + '\x90', '\x00', '\x00', '\xb0', '\xe9', '\x9b', '\x6f', '\x9e', + '\x01', '\x40', '\x8c', '\x00', '\x7f', '\x0d', '\x80', '\x00', + '\x00', '\xb0', '\xe9', '\x9b', '\x6f', '\xce', '\x01', '\x00', + '\x01', '\x40', '\x7f', '\x0d', '\x84', '\x00', '\x00', '\xb0', + '\xec', '\xcb', '\x6f', '\xde', '\x8c', '\x00', '\x01', '\x00', + '\x7f', '\x0d', '\x88', '\x00', '\x00', '\xb0', '\xed', '\xdb', + '\x41', '\x12', '\x7f', '\x0d', '\x94', '\x00', '\x00', '\xb0', + '\xe1', '\x1b', '\x7f', '\x0d', '\xa0', '\x00', '\x00', '\xb0', + '\x70', '\x8a', '\x5f', '\x9c', '\x02', '\x01', '\x7f', '\x0d', + '\x9c', '\x00', '\x00', '\xb0', '\xe9', '\x9b', '\x43', '\xc2', + '\x7f', '\x0d', '\x98', '\x00', '\x00', '\xb0', '\xec', '\xcb', + '\x44', '\xd2', '\x7f', '\x0d', '\xd0', '\x01', '\x00', '\xb0', + '\xcd', '\xdb', '\x6f', '\x0e', '\xd4', '\x01', '\x00', '\xb0', + '\xc0', '\xdb', '\x6f', '\xbe', '\x14', '\x1c', '\x00', '\x38', + '\x6b', '\x96', '\x4f', '\xcc', '\x26', '\x00', '\xd9', '\xcf', + '\x79', '\x4a', '\x6f', '\xde', '\x4a', '\x1c', '\x00', '\x38', + '\x04', '\xb1', '\xed', '\xdb', '\x6f', '\x9e', '\x6c', '\x1c', + '\x00', '\x38', '\x08', '\xb1', '\xe9', '\x9b', '\x6d', '\x96', + '\x5f', '\xce', '\xdc', '\x05', '\xd9', '\xcf', '\x47', '\xc2', + '\xd9', '\xcb', '\x6f', '\x9e', '\x04', '\x01', '\x00', '\x38', + '\x69', '\x9a', '\x08', '\xd1', '\xe9', '\x9b', '\x6f', '\xce', + '\x2a', '\x1c', '\x00', '\x38', '\x6f', '\x9e', '\x00', '\x8c', + '\x40', '\x02', '\x79', '\x67', '\x6c', '\xd6', '\xed', '\x9f', + '\x5f', '\x9e', '\x00', '\x01', '\x79', '\x27', '\xdd', '\x9b', + '\x6c', '\xa6', '\x86', '\xa2', '\x4f', '\x9c', '\x40', '\x00', + '\x79', '\x27', '\x06', '\xc1', '\xd9', '\x9b', '\x6f', '\x9e', + '\x00', '\x03', '\xaa', '\xaa', '\x79', '\x67', '\x08', '\xc1', + '\xe9', '\x9b', '\x6f', '\x9e', '\x56', '\x88', '\x8c', '\x40', + '\x79', '\x67', '\x0c', '\xc1', '\xe9', '\x9b', '\x7e', '\x92', + '\x79', '\x67', '\x10', '\xc1', '\xe9', '\x9b', '\x14', '\xc1', + '\x70', '\x8a', '\x18', '\xc1', '\x70', '\x8a', '\x6f', '\xde', + '\x9e', '\x1c', '\x00', '\x38', '\x6d', '\x96', '\x4f', '\xcc', + '\x26', '\x00', '\xd9', '\xcf', '\x47', '\xc2', '\xd9', '\xcb', + '\x08', '\xd1', '\xea', '\xab', '\x7f', '\x0d', '\x5a', '\x1c', + '\x00', '\x38', '\x70', '\x0a', '\x7f', '\x0d', '\x9a', '\x1c', + '\x00', '\x38', '\x70', '\x8a', '\x7f', '\x0d', '\xa4', '\x01', + '\x00', '\xb0', '\xeb', '\xbb', '\xc0', '\x1b', '\x7f', '\xb6', + '\xbe', '\x1f', '\xfc', '\xe1', '\x7e', '\xbe', '\x84', '\xe2', + '\xfe', '\x0b', '\x6f', '\x0e', '\x4a', '\x1c', '\x00', '\x38', + '\x0e', '\x01', '\x5d', '\x9e', '\x81', '\x93', '\xb4', '\xa0', + '\x7a', '\x86', '\x7d', '\x4a', '\x6f', '\x9e', '\x14', '\x1c', + '\x00', '\x38', '\x7f', '\x0d', '\xa4', '\x01', '\x00', '\xb0', + '\xe9', '\x9b', '\x6f', '\xde', '\x86', '\x1c', '\x00', '\x38', + '\x6d', '\xda', '\x7d', '\x67', '\x6f', '\x9e', '\x9a', '\x1c', + '\x00', '\x38', '\x69', '\x9a', '\x01', '\x92', '\xe9', '\xd6', + '\x8a', '\x20', '\x41', '\xa2', '\x41', '\x92', '\x7f', '\x0d', + '\x96', '\x1c', '\x00', '\x38', '\xc9', '\x9b', '\x6f', '\x9e', + '\x20', '\x00', '\x00', '\xb0', '\x69', '\x9a', '\xf0', '\x93', + '\x7f', '\x0d', '\xae', '\x1c', '\x00', '\x38', '\xe9', '\x9b', + '\x6f', '\xae', '\x92', '\x1c', '\x00', '\x38', '\x0c', '\x01', + '\x5b', '\xb8', '\x6a', '\xda', '\x2b', '\xd6', '\x84', '\xd2', + '\xea', '\xdb', '\x08', '\x01', '\x6c', '\x9e', '\x2b', '\x96', + '\x84', '\x92', '\xec', '\x9b', '\x60', '\xc6', '\x6f', '\xbe', + '\x00', '\x01', '\x00', '\x38', '\x6b', '\x9a', '\xad', '\x96', + '\x84', '\x92', '\xdf', '\x9c', '\xdb', '\x05', '\x0a', '\x90', + '\x0f', '\x05', '\x6b', '\x9a', '\x9a', '\x9a', '\x06', '\xe0', + '\x04', '\x92', '\x5f', '\x9e', '\xdc', '\x05', '\xdc', '\x9b', + '\x6f', '\xce', '\x4a', '\x1c', '\x00', '\x38', '\x5c', '\xda', + '\x5d', '\x94', '\x26', '\x92', '\xcf', '\x9c', '\x3f', '\x00', + '\x04', '\x90', '\x0f', '\x05', '\x5a', '\xd2', '\xdc', '\xdb', + '\x6f', '\xde', '\x9a', '\x1c', '\x00', '\x38', '\x6d', '\x9a', + '\x01', '\x92', '\xed', '\x9b', '\x3f', '\xbd', '\x30', '\x04', + '\x00', '\x38', '\x41', '\xa2', '\xbe', '\x0f', '\x3e', '\x0d', + '\x6f', '\x9e', '\x5a', '\x1c', '\x00', '\x38', '\x89', '\x0b', + '\x44', '\x20', '\x41', '\xc2', '\xc9', '\xcb', '\x6f', '\x9e', + '\x04', '\x00', '\x00', '\xb0', '\x69', '\x9a', '\x06', '\x93', + '\xc4', '\x92', '\x1e', '\x20', '\x0f', '\x05', '\x6f', '\x9e', + '\x24', '\x1c', '\x00', '\x38', '\x6f', '\xde', '\xdc', '\x00', + '\x00', '\x38', '\x6d', '\xda', '\xe9', '\xdf', '\x6f', '\xce', + '\xe0', '\x00', '\x00', '\x38', '\x5c', '\xca', '\x16', '\xe0', + '\xd9', '\xcb', '\x6f', '\xde', '\x24', '\x1c', '\x00', '\x38', + '\x6f', '\x9e', '\x72', '\x1c', '\x00', '\x38', '\x69', '\xce', + '\xed', '\xcf', '\x59', '\x9a', '\xdd', '\x9b', '\x6f', '\xde', + '\x24', '\x1c', '\x00', '\x38', '\x6f', '\x9e', '\x9a', '\x1c', + '\x00', '\x38', '\x69', '\x9a', '\x79', '\x67', '\x1a', '\xd1', + '\xe9', '\x9b', '\x42', '\x92', '\x79', '\x67', '\x1e', '\xd1', + '\xe9', '\x9b', '\x6f', '\x9e', '\x9e', '\x1c', '\x00', '\x38', + '\x47', '\xd2', '\x02', '\x91', '\xdd', '\xdb', '\x4f', '\xcc', + '\x26', '\x00', '\xd9', '\xcb', '\x3f', '\x0d', '\xb2', '\x04', + '\x00', '\x38', '\x6f', '\x9e', '\x9e', '\x1c', '\x00', '\x38', + '\x7f', '\x0d', '\xa0', '\x01', '\x00', '\xb0', '\xe9', '\x9b', + '\x41', '\x92', '\x7f', '\x0d', '\xd0', '\x01', '\x00', '\xb0', + '\xc9', '\x9b', '\x6f', '\x9e', '\xa0', '\x01', '\x00', '\xb0', + '\x69', '\x9a', '\xf7', '\x20', '\x0f', '\x05', '\x7f', '\xb6', + '\x0f', '\x05', '\x6f', '\x9e', '\x9e', '\x1c', '\x00', '\x38', + '\x6f', '\xce', '\x5c', '\x1c', '\x00', '\x38', '\x04', '\x91', + '\xec', '\xcb', '\x02', '\x91', '\x70', '\x4a', '\x8a', '\x0b', + '\x0c', '\x30', '\x7d', '\x86', '\x01', '\xd2', '\x4a', '\xd5', + '\x80', '\x0b', '\xf9', '\x20', '\x0f', '\x05', '\x7f', '\x0d', + '\x42', '\x1c', '\x00', '\x38', '\x70', '\x8a', '\x6f', '\x9e', + '\x5c', '\x1c', '\x00', '\x38', '\x47', '\xc2', '\x02', '\x91', + '\xdc', '\xcb', '\x08', '\x91', '\xea', '\xab', '\x01', '\xd2', + '\xd9', '\xdb', '\x3f', '\x0d', '\xb2', '\x04', '\x00', '\x38', + '\xfc', '\xe1', '\x7e', '\xbe', '\x84', '\xe2', '\xee', '\xab', + '\x6f', '\x9e', '\x9e', '\x1c', '\x00', '\x38', '\x6f', '\xde', + '\x5c', '\x1c', '\x00', '\x38', '\x04', '\x91', '\xed', '\xdb', + '\x02', '\x91', '\x70', '\x4a', '\x4b', '\xb6', '\x04', '\x20', + '\x46', '\x92', '\x45', '\x92', '\x79', '\x67', '\x7f', '\x0d', + '\x42', '\x1c', '\x00', '\x38', '\xe9', '\x9b', '\x79', '\x86', + '\x01', '\x92', '\xdf', '\x9c', '\x00', '\x40', '\xf9', '\x20', + '\x0f', '\x05', '\x6e', '\x9a', '\x79', '\x67', '\xee', '\x9b', + '\x6f', '\x9e', '\x5c', '\x1c', '\x00', '\x38', '\x47', '\xd2', + '\x02', '\x91', '\xdd', '\xdb', '\x08', '\x91', '\xee', '\xeb', + '\x44', '\xd2', '\xd9', '\xdb', '\x3f', '\xbd', '\xb2', '\x04', + '\x00', '\x38', '\x04', '\xe2', '\x3e', '\x0d', '\x00', '\x00', + '\xfc', '\xe1', '\x7e', '\xbe', '\x84', '\xe2', '\xfe', '\x0b', + '\x6f', '\x0e', '\xda', '\x04', '\x00', '\x38', '\x6f', '\xae', + '\xf4', '\x17', '\x00', '\x38', '\xb0', '\xb9', '\x6f', '\xae', + '\x46', '\x1c', '\x00', '\x38', '\x6a', '\xaa', '\x7a', '\x67', + '\x41', '\xb2', '\x3f', '\xbd', '\x20', '\x05', '\x00', '\x38', + '\x6f', '\xae', '\xc0', '\x1b', '\x00', '\x38', '\xb0', '\xb9', + '\x6f', '\x9e', '\xf0', '\x00', '\x00', '\x38', '\xef', '\x9e', + '\x06', '\x1c', '\x00', '\x38', '\x0e', '\x30', '\x70', '\x86', + '\x09', '\x0c', '\xef', '\x9e', '\x06', '\x1c', '\x00', '\x38', + '\xf7', '\x20', '\x0f', '\x05', '\x6f', '\xae', '\x06', '\x18', + '\x00', '\x38', '\x3f', '\xbd', '\xda', '\x04', '\x00', '\x38', + '\x60', '\xa6', '\x41', '\xb2', '\x3f', '\xbd', '\x20', '\x05', + '\x00', '\x38', '\x3f', '\xbd', '\xf6', '\x05', '\x00', '\x38', + '\x3f', '\x0d', '\x28', '\x01', '\x00', '\x38', '\xbe', '\x0f', + '\x3e', '\x0d', '\xff', '\xe0', '\x0f', '\x05', '\xfc', '\xe1', + '\x7e', '\xbe', '\x84', '\xe2', '\xfe', '\x0b', '\x6f', '\x0e', + '\xda', '\x04', '\x00', '\x38', '\x6f', '\xae', '\x22', '\x18', + '\x00', '\x38', '\xb0', '\xb9', '\x3f', '\xbd', '\x30', '\x04', + '\x00', '\x38', '\x6f', '\xae', '\x00', '\x1f', '\x00', '\x38', + '\x5f', '\xbc', '\xec', '\x01', '\x3f', '\xbd', '\x74', '\x09', + '\x00', '\x38', '\x6f', '\xae', '\x3c', '\x18', '\x00', '\x38', + '\xb0', '\xb9', '\x3f', '\xbd', '\x3a', '\x06', '\x00', '\x38', + '\xbe', '\x0f', '\x3e', '\xbe', '\x3f', '\x0d', '\xf2', '\x05', + '\x00', '\x38', '\xfc', '\xe1', '\x7e', '\xbe', '\x98', '\xe2', + '\xfe', '\x4b', '\x6f', '\xde', '\x00', '\x1f', '\x00', '\x38', + '\x6d', '\x9a', '\x79', '\x67', '\xed', '\x9f', '\xef', '\xde', + '\xec', '\x20', '\x00', '\x38', '\xf3', '\x20', '\x0f', '\x05', + '\x6f', '\x3e', '\x00', '\x1f', '\x00', '\x38', '\xa3', '\x0b', + '\xff', '\x3d', '\xfe', '\x02', '\x0f', '\x05', '\x63', '\x9a', + '\x81', '\x92', '\xcf', '\x9d', '\x0b', '\x00', '\x5f', '\x95', + '\x3f', '\xf8', '\x54', '\x02', '\x22', '\x01', '\x18', '\x00', + '\x62', '\x00', '\x90', '\x00', '\x96', '\x01', '\xc8', '\x01', + '\xe4', '\x00', '\x00', '\x02', '\xb8', '\x00', '\x9a', '\x02', + '\xce', '\x02', '\x6f', '\xae', '\x4e', '\x18', '\x00', '\x38', + '\x3f', '\xbd', '\xda', '\x04', '\x00', '\x38', '\x6f', '\x0e', + '\x20', '\x05', '\x00', '\x38', '\x04', '\x31', '\x62', '\xae', + '\x41', '\xb2', '\xb0', '\xb9', '\x08', '\x31', '\x61', '\xae', + '\x41', '\xb2', '\xb0', '\xb9', '\x6f', '\x0e', '\x9a', '\x1c', + '\x00', '\x38', '\x60', '\x9a', '\x81', '\x92', '\xe0', '\x9b', + '\x3f', '\xbd', '\x30', '\x04', '\x00', '\x38', '\x60', '\x9a', + '\x01', '\x92', '\xe0', '\x9b', '\x62', '\xaa', '\x61', '\xba', + '\x3f', '\xbd', '\x74', '\x09', '\x00', '\x38', '\xff', '\xed', + '\x88', '\x02', '\x0c', '\x32', '\x6f', '\xae', '\x5c', '\x18', + '\x00', '\x38', '\x3f', '\xbd', '\xda', '\x04', '\x00', '\x38', + '\x6f', '\x0e', '\x20', '\x05', '\x00', '\x38', '\x04', '\x31', + '\x62', '\xae', '\x41', '\xb2', '\xb0', '\xb9', '\x08', '\x31', + '\x61', '\xae', '\x41', '\xb2', '\xb0', '\xb9', '\x61', '\x1a', + '\x72', '\x09', '\xe1', '\x1b', '\xff', '\xed', '\x5a', '\x02', + '\x0c', '\x32', '\x6f', '\xae', '\x6c', '\x18', '\x00', '\x38', + '\x3f', '\xbd', '\xda', '\x04', '\x00', '\x38', '\x6f', '\x1e', + '\x20', '\x05', '\x00', '\x38', '\x04', '\x31', '\x60', '\xae', + '\x41', '\xb2', '\xb1', '\xb9', '\x60', '\xaa', '\x6a', '\xaa', + '\x41', '\xb2', '\xb1', '\xb9', '\xff', '\xed', '\x32', '\x02', + '\x08', '\x32', '\x6f', '\xae', '\x7c', '\x18', '\x00', '\x38', + '\x3f', '\xbd', '\xda', '\x04', '\x00', '\x38', '\x04', '\x31', + '\x60', '\xae', '\x41', '\xb2', '\x3f', '\xbd', '\x20', '\x05', + '\x00', '\x38', '\x60', '\xaa', '\xff', '\x3d', '\xc0', '\x01', + '\x0f', '\x05', '\x81', '\xa2', '\xfd', '\x20', '\x0f', '\x05', + '\xff', '\xed', '\x06', '\x02', '\x08', '\x32', '\x6f', '\x4e', + '\xda', '\x04', '\x00', '\x38', '\x6f', '\xae', '\x8a', '\x18', + '\x00', '\x38', '\xb4', '\xb9', '\x6f', '\x0e', '\x20', '\x05', + '\x00', '\x38', '\x04', '\x31', '\x62', '\xae', '\x41', '\xb2', + '\xb0', '\xb9', '\x08', '\x31', '\x61', '\xae', '\x41', '\xb2', + '\xb0', '\xb9', '\x62', '\x2a', '\x62', '\x2a', '\xe1', '\x2a', + '\xff', '\x3d', '\xb8', '\x01', '\x0f', '\x05', '\x6f', '\xae', + '\x98', '\x18', '\x00', '\x38', '\xb4', '\xb9', '\xff', '\xed', + '\xd0', '\x01', '\x0f', '\x05', '\x6f', '\x4e', '\xda', '\x04', + '\x00', '\x38', '\x6f', '\xae', '\xa8', '\x18', '\x00', '\x38', + '\xb4', '\xb9', '\x6f', '\x2e', '\x20', '\x05', '\x00', '\x38', + '\x04', '\x31', '\x61', '\xae', '\x41', '\xb2', '\xb2', '\xb9', + '\x08', '\x31', '\x60', '\xae', '\x41', '\xb2', '\xb2', '\xb9', + '\x61', '\xaa', '\x60', '\xba', '\x6e', '\xc6', '\x14', '\xc2', + '\x3f', '\xbd', '\x72', '\x0a', '\x00', '\x38', '\x6a', '\xa6', + '\x30', '\x20', '\x0f', '\x05', '\x6f', '\xae', '\xb4', '\x18', + '\x00', '\x38', '\xb4', '\xb9', '\x14', '\xe1', '\x6a', '\xaa', + '\x41', '\xb2', '\xb2', '\xb9', '\x14', '\xe1', '\x6a', '\xaa', + '\x6a', '\xb6', '\x0f', '\xbc', '\x40', '\x00', '\x8f', '\xac', + '\x40', '\x00', '\x3c', '\xa3', '\x3c', '\xb3', '\x3f', '\xbd', + '\x1a', '\x0b', '\x00', '\x38', '\xff', '\xed', '\x6a', '\x01', + '\x0f', '\x05', '\x6f', '\xae', '\xd0', '\x18', '\x00', '\x38', + '\xb4', '\xb9', '\xff', '\xed', '\x54', '\x01', '\x0c', '\x32', + '\x6f', '\xae', '\xe6', '\x18', '\x00', '\x38', '\x3f', '\xbd', + '\xda', '\x04', '\x00', '\x38', '\x6f', '\x0e', '\x20', '\x05', + '\x00', '\x38', '\x04', '\x31', '\x62', '\xae', '\x41', '\xb2', + '\xb0', '\xb9', '\x08', '\x31', '\x61', '\xae', '\x41', '\xb2', + '\xb0', '\xb9', '\x62', '\xaa', '\x61', '\xba', '\x3f', '\xbd', + '\x1a', '\x0b', '\x00', '\x38', '\xff', '\xed', '\x22', '\x01', + '\x0c', '\x32', '\x6f', '\xae', '\xf2', '\x18', '\x00', '\x38', + '\x3f', '\xbd', '\xda', '\x04', '\x00', '\x38', '\x6f', '\x0e', + '\x20', '\x05', '\x00', '\x38', '\x04', '\x31', '\x62', '\xae', + '\x41', '\xb2', '\xb0', '\xb9', '\x08', '\x31', '\x61', '\xae', + '\x41', '\xb2', '\xb0', '\xb9', '\x62', '\xaa', '\xe1', '\xaa', + '\xda', '\x90', '\x0f', '\x05', '\x7a', '\x0e', '\x08', '\x31', + '\xea', '\xaa', '\xf9', '\x80', '\x0f', '\x05', '\xea', '\xe0', + '\x0c', '\x32', '\x6f', '\xae', '\xfe', '\x18', '\x00', '\x38', + '\x3f', '\xbd', '\xda', '\x04', '\x00', '\x38', '\x6f', '\x0e', + '\x20', '\x05', '\x00', '\x38', '\x04', '\x31', '\x61', '\xae', + '\x41', '\xb2', '\xb0', '\xb9', '\x08', '\x31', '\x64', '\xae', + '\x41', '\xb2', '\xb0', '\xb9', '\x0c', '\x31', '\x62', '\xae', + '\x41', '\xb2', '\xb0', '\xb9', '\x6f', '\x0e', '\xba', '\x14', + '\x00', '\x38', '\x61', '\xaa', '\x64', '\xba', '\x62', '\xca', + '\xb0', '\xb9', '\x6a', '\xa6', '\xac', '\x30', '\x10', '\x32', + '\xc3', '\xa2', '\xae', '\x20', '\x7a', '\x86', '\x62', '\xca', + '\xef', '\xcd', '\x00', '\x00', '\x01', '\x00', '\x64', '\xba', + '\xb0', '\xb9', '\x9e', '\xe0', '\x0f', '\x05', '\x6f', '\xde', + '\x24', '\x1c', '\x00', '\x38', '\x6d', '\x9a', '\x7f', '\x0d', + '\xc0', '\x01', '\x00', '\xb0', '\xe9', '\x9b', '\x04', '\xd1', + '\x59', '\x98', '\x7f', '\x0d', '\xc4', '\x01', '\x00', '\xb0', + '\xe9', '\x9b', '\x6f', '\x1e', '\xda', '\x04', '\x00', '\x38', + '\x6f', '\xae', '\x06', '\x19', '\x00', '\x38', '\xb1', '\xb9', + '\x04', '\x31', '\x60', '\xae', '\x41', '\xb2', '\x3f', '\xbd', + '\x20', '\x05', '\x00', '\x38', '\x6f', '\xae', '\x0e', '\x19', + '\x00', '\x38', '\xb1', '\xb9', '\x60', '\x9a', '\xb9', '\x09', + '\x50', '\xe0', '\x08', '\x32', '\x6f', '\xae', '\x82', '\x18', + '\x00', '\x38', '\x3f', '\xbd', '\xda', '\x04', '\x00', '\x38', + '\x6f', '\x0e', '\x20', '\x05', '\x00', '\x38', '\x04', '\x31', + '\x61', '\xae', '\x41', '\xb2', '\xb0', '\xb9', '\x08', '\x31', + '\x62', '\xae', '\x41', '\xb2', '\xb0', '\xb9', '\x61', '\x1a', + '\x61', '\x9a', '\x08', '\x30', '\x81', '\x92', '\xe1', '\x9b', + '\x20', '\xe0', '\x62', '\x3a', '\x1c', '\xe0', '\x0c', '\x32', + '\x6f', '\xae', '\x14', '\x19', '\x00', '\x38', '\x3f', '\xbd', + '\xda', '\x04', '\x00', '\x38', '\x63', '\xaa', '\x41', '\xb2', + '\x3f', '\xbd', '\x20', '\x05', '\x00', '\x38', '\x0a', '\xe0', + '\x0f', '\x05', '\xa3', '\x0b', '\xff', '\x2d', '\x06', '\xfd', + '\x0f', '\x05', '\x6f', '\xae', '\x0e', '\x19', '\x00', '\x38', + '\x3f', '\xbd', '\xda', '\x04', '\x00', '\x38', '\xbe', '\x4f', + '\x04', '\xe2', '\x3e', '\x0d', '\xfc', '\xe1', '\x7e', '\xbe', + '\x8c', '\xe2', '\xfe', '\x2b', '\x6a', '\x26', '\x6b', '\x06', + '\x7f', '\x0d', '\x92', '\x1c', '\x00', '\x38', '\x70', '\x8a', + '\x7f', '\x0d', '\x04', '\x01', '\x00', '\x38', '\xea', '\xab', + '\x6f', '\x9e', '\x96', '\x1c', '\x00', '\x38', '\x49', '\x9a', + '\xcf', '\x9e', '\x01', '\x00', '\x86', '\x20', '\x0f', '\x05', + '\x6f', '\xde', '\x4a', '\x1c', '\x00', '\x38', '\x08', '\xd1', + '\xea', '\xab', '\x7f', '\x0d', '\x00', '\x01', '\x00', '\x38', + '\xeb', '\xbb', '\x6b', '\x96', '\x04', '\x92', '\xdf', '\x9d', + '\xdc', '\x05', '\xdd', '\x9b', '\x6f', '\x9e', '\xa4', '\x01', + '\x00', '\xb0', '\x69', '\xda', '\x6f', '\xde', '\x14', '\x1c', + '\x00', '\x38', '\xe9', '\xdb', '\x6f', '\xde', '\xd4', '\x01', + '\x00', '\xb0', '\x4d', '\x9a', '\x38', '\x93', '\x44', '\x93', + '\xcd', '\x9b', '\x6f', '\xde', '\xd4', '\x01', '\x00', '\xb0', + '\x4d', '\x9a', '\x07', '\x93', '\xcf', '\x9e', '\x04', '\x00', + '\xf7', '\x30', '\x0f', '\x05', '\x4d', '\x9a', '\x38', '\x93', + '\x41', '\x93', '\xcd', '\x9b', '\x3f', '\xbd', '\xcc', '\x01', + '\x00', '\x38', '\x6a', '\xa6', '\xf7', '\x30', '\x0f', '\x05', + '\x6f', '\xce', '\x92', '\x1c', '\x00', '\x38', '\xec', '\x0a', + '\x10', '\x80', '\x0f', '\x05', '\x6f', '\xde', '\xd4', '\x01', + '\x00', '\xb0', '\x4d', '\x9a', '\x38', '\x93', '\x41', '\x93', + '\xcd', '\x9b', '\xec', '\x0a', '\xd7', '\x90', '\x71', '\x86', + '\x22', '\xe0', '\x62', '\x96', '\x7f', '\x0d', '\x92', '\x1c', + '\x00', '\x38', '\xeb', '\xba', '\x14', '\x80', '\x71', '\x86', + '\x3f', '\xbd', '\xcc', '\x01', '\x00', '\x38', '\x7f', '\x0d', + '\x92', '\x1c', '\x00', '\x38', '\xe0', '\x0a', '\xf1', '\x90', + '\x71', '\x86', '\x62', '\x96', '\x20', '\x96', '\xe9', '\x26', + '\x0e', '\x30', '\x62', '\xd6', '\x0d', '\x1c', '\x62', '\x96', + '\x20', '\x96', '\xe9', '\xd6', '\xf7', '\x20', '\x0f', '\x05', + '\x6f', '\xae', '\x28', '\x19', '\x00', '\x38', '\x3f', '\xbd', + '\xda', '\x04', '\x00', '\x38', '\x61', '\xa6', '\x41', '\xb2', + '\xbe', '\x2f', '\x3e', '\xbe', '\x3f', '\x0d', '\x20', '\x05', + '\x00', '\x38', '\xfc', '\xe1', '\x7e', '\xbe', '\x8c', '\xe2', + '\xfe', '\x2b', '\x6b', '\x06', '\x6c', '\x26', '\xeb', '\xa6', + '\x40', '\x00', '\x6a', '\xc6', '\xe0', '\xc6', '\x32', '\x00', + '\x71', '\x86', '\x6c', '\xb6', '\x6c', '\x96', '\x79', '\x87', + '\x61', '\xd6', '\xc3', '\xd3', '\xed', '\x97', '\x49', '\xd6', + '\xcb', '\x9b', '\x4b', '\x9a', '\xcd', '\x96', '\x0c', '\x30', + '\x7d', '\x87', '\x6f', '\xae', '\x3e', '\x19', '\x00', '\x38', + '\x40', '\xe0', '\xe2', '\xbb', '\xcb', '\xdf', '\x01', '\x12', + '\xc4', '\x12', '\x06', '\x30', '\xe0', '\xb6', '\xd7', '\x10', + '\x6c', '\x96', '\x04', '\xc2', '\xe0', '\xc6', '\xc5', '\x10', + '\x0f', '\x05', '\xe0', '\xa6', '\x4e', '\x00', '\x6a', '\xc6', + '\xe0', '\xc6', '\x40', '\x00', '\x71', '\x86', '\x6c', '\xa6', + '\x61', '\x96', '\xc3', '\x93', '\x6c', '\xd6', '\xe9', '\xd7', + '\x4a', '\x9a', '\xcd', '\x96', '\x22', '\x30', '\x01', '\x12', + '\x81', '\x12', '\xe2', '\xab', '\x6f', '\xae', '\x5c', '\x19', + '\x00', '\x38', '\x3f', '\xbd', '\xda', '\x04', '\x00', '\x38', + '\x62', '\xaa', '\x41', '\xb2', '\x3f', '\xbd', '\x20', '\x05', + '\x00', '\x38', '\x7a', '\x86', '\xbe', '\x2f', '\x3e', '\x0d', + '\xc4', '\x12', '\x08', '\x30', '\x01', '\xa2', '\xe0', '\xa6', + '\xc9', '\x10', '\x61', '\x96', '\x04', '\xc2', '\xe0', '\xc6', + '\xb7', '\x10', '\x0f', '\x05', '\x41', '\xa2', '\xbe', '\x2f', + '\x3e', '\x0d', '\xfc', '\xe1', '\x7e', '\xbe', '\x94', '\xe2', + '\xfe', '\x4b', '\x6b', '\x26', '\xeb', '\xa6', '\x5a', '\x90', + '\x6a', '\x06', '\x60', '\xa6', '\x7b', '\x86', '\x3f', '\xbd', + '\x20', '\x05', '\x00', '\x38', '\x6f', '\xae', '\x7a', '\x19', + '\x00', '\x38', '\x3f', '\xbd', '\xda', '\x04', '\x00', '\x38', + '\xe2', '\x06', '\x2a', '\x90', '\x74', '\x86', '\x60', '\x16', + '\x60', '\x36', '\x6f', '\xae', '\xd0', '\x19', '\x00', '\x38', + '\x3f', '\xbd', '\xda', '\x04', '\x00', '\x38', '\x63', '\xae', + '\x7b', '\x86', '\x3f', '\xbd', '\x20', '\x05', '\x00', '\x38', + '\x01', '\x42', '\xc4', '\x42', '\x08', '\x30', '\x04', '\x12', + '\xe2', '\x16', '\xdf', '\x80', '\x0f', '\x05', '\x6f', '\xae', + '\x38', '\x18', '\x00', '\x38', '\x3f', '\xbd', '\xda', '\x04', + '\x00', '\x38', '\x10', '\x02', '\xe2', '\x06', '\xad', '\x80', + '\x60', '\xa6', '\xbe', '\x4f', '\x3e', '\x0d', '\x00', '\x00', + '\x05', '\xa1', '\x49', '\x98', '\xc2', '\x92', '\x0a', '\x30', + '\xc4', '\x92', '\x0e', '\x30', '\x0f', '\x05', '\x7f', '\xb6', + '\x7a', '\x86', '\x6a', '\xb9', '\x5a', '\xa8', '\x7f', '\xb6', + '\x0f', '\x05', '\x6a', '\xb9', '\x6a', '\xaa', '\x7f', '\xb6', + '\x0f', '\x05', '\x6a', '\xd6', '\x05', '\xa1', '\x4a', '\xaa', + '\x4a', '\x94', '\xc2', '\x92', '\x0a', '\x30', '\xc4', '\x92', + '\x10', '\x30', '\x0f', '\x05', '\x7f', '\xb6', '\x7a', '\x86', + '\x5c', '\xca', '\x6d', '\xb9', '\xdc', '\xcb', '\x7f', '\xb6', + '\x4a', '\xa4', '\x6c', '\xca', '\x6d', '\xb9', '\xec', '\xcb', + '\x4a', '\xa4', '\x7f', '\xb6', '\x0f', '\x05', '\xfc', '\xe1', + '\x7e', '\xbe', '\x84', '\xe2', '\xee', '\xbb', '\x04', '\xa1', + '\x49', '\x9a', '\xcf', '\x9e', '\x01', '\x00', '\x06', '\x20', + '\x0f', '\x05', '\x24', '\xe0', '\xc1', '\xc3', '\xcf', '\x9e', + '\x02', '\x00', '\x0c', '\x20', '\x6b', '\x96', '\xd0', '\x93', + '\x69', '\xb7', '\xee', '\xbb', '\x12', '\xe0', '\xc2', '\xc3', + '\x6f', '\xae', '\xa6', '\x19', '\x00', '\x38', '\x3f', '\xbd', + '\xda', '\x04', '\x00', '\x38', '\x0c', '\xe0', '\x0f', '\x05', + '\x6c', '\xb6', '\x6e', '\xc6', '\x3f', '\xbd', '\xaa', '\x0b', + '\x00', '\x38', '\x04', '\xe2', '\x3e', '\x0d', '\xfc', '\xe1', + '\x7e', '\xbe', '\x84', '\xe2', '\xfe', '\x0b', '\x6a', '\x06', + '\x4f', '\xbc', '\xaa', '\x00', '\x5f', '\xcc', '\x55', '\x05', + '\x3f', '\xbd', '\xd6', '\x0b', '\x00', '\x38', '\x60', '\xa6', + '\x4f', '\xbc', '\x55', '\x00', '\x5f', '\xcc', '\xaa', '\x02', + '\xbe', '\x0f', '\x3e', '\xbe', '\x3f', '\x0d', '\xd6', '\x0b', + '\x00', '\x38', '\xfc', '\xe1', '\x7e', '\xbe', '\x90', '\xe2', + '\xfe', '\x3b', '\x6a', '\x26', '\x04', '\xa1', '\x49', '\x9a', + '\xcf', '\x9e', '\x02', '\x00', '\x42', '\x20', '\x6b', '\x36', + '\x6f', '\x0e', '\x88', '\x0b', '\x00', '\x38', '\xb0', '\xb9', + '\x6a', '\x16', '\x62', '\xa6', '\x63', '\xb6', '\xb0', '\xb9', + '\x61', '\xd6', '\xf0', '\xd3', '\x1f', '\xdf', '\x40', '\x00', + '\x6a', '\x96', '\xf0', '\x93', '\x1f', '\x9f', '\x40', '\x00', + '\xe9', '\xd6', '\x14', '\x20', '\x7c', '\x86', '\x2f', '\x1f', + '\x40', '\x00', '\x00', '\x00', '\x2f', '\xaf', '\x40', '\x00', + '\x00', '\x00', '\xea', '\x16', '\x04', '\x30', '\x0f', '\x05', + '\x41', '\xc2', '\x6c', '\xa6', '\xbe', '\x3f', '\x3e', '\x0d', + '\x6f', '\x1e', '\x88', '\x0b', '\x00', '\x38', '\xb1', '\xb9', + '\x4a', '\x04', '\x0f', '\x0f', '\x40', '\x00', '\x62', '\xa6', + '\x63', '\xb6', '\xb1', '\xb9', '\x2f', '\xaf', '\x40', '\x00', + '\x00', '\x00', '\xea', '\x06', '\x3a', '\x25', '\xbe', '\x3f', + '\x3e', '\x0d', '\xfc', '\xe1', '\x7e', '\xbe', '\xa8', '\xe2', + '\xfe', '\x8b', '\x6a', '\x36', '\x04', '\xa1', '\x44', '\x9e', + '\xcf', '\x9e', '\x02', '\x00', '\x04', '\x20', '\x41', '\x72', + '\x42', '\x72', '\x6f', '\x2e', '\xd6', '\x0b', '\x00', '\x38', + '\x4f', '\xbc', '\x98', '\x00', '\x4f', '\xcc', '\x55', '\x00', + '\xb2', '\xb9', '\x50', '\xb2', '\xe7', '\xb4', '\x6f', '\x1e', + '\x88', '\x0b', '\x00', '\x38', '\x63', '\xa6', '\xb1', '\xb9', + '\xcf', '\xae', '\x51', '\x00', '\xff', '\x2d', '\x9c', '\x01', + '\x63', '\xa6', '\x51', '\xb2', '\xe7', '\xb4', '\xb1', '\xb9', + '\xcf', '\xae', '\x52', '\x00', '\xff', '\x2d', '\x8c', '\x01', + '\x63', '\xa6', '\x52', '\xb2', '\xe7', '\xb4', '\xb1', '\xb9', + '\xcf', '\xae', '\x59', '\x00', '\xff', '\x2d', '\x7c', '\x01', + '\x63', '\xa6', '\x24', '\xe1', '\x70', '\x8a', '\x6f', '\xae', + '\xc0', '\x19', '\x00', '\x38', '\x3f', '\xbd', '\xda', '\x04', + '\x00', '\x38', '\x63', '\xaa', '\x41', '\xb2', '\x3f', '\xbd', + '\x20', '\x05', '\x00', '\x38', '\x4f', '\xbc', '\x27', '\x00', + '\xe7', '\xb4', '\x63', '\xa6', '\xb1', '\xb9', '\x41', '\x92', + '\xea', '\x94', '\x06', '\x32', '\xe3', '\x9b', '\x86', '\x32', + '\x4f', '\xbc', '\x2c', '\x00', '\xe7', '\xb4', '\x63', '\xa6', + '\xb1', '\xb9', '\x6a', '\x86', '\x55', '\xb2', '\xe7', '\xb4', + '\x63', '\xa6', '\xb1', '\xb9', '\x6a', '\x06', '\x6a', '\xb6', + '\x04', '\xb2', '\xe7', '\xb4', '\x63', '\xa6', '\xb1', '\xb9', + '\xcf', '\xae', '\x30', '\x00', '\x3e', '\x20', '\x63', '\xa6', + '\x4f', '\xbc', '\xf0', '\x00', '\x5f', '\xcc', '\x55', '\x05', + '\xb2', '\xb9', '\x63', '\xa6', '\x3f', '\xbd', '\x1e', '\x0c', + '\x00', '\x38', '\x63', '\xa6', '\x4f', '\xbc', '\x90', '\x00', + '\x5f', '\xcc', '\x55', '\x05', '\xb2', '\xb9', '\x44', '\xb8', + '\x2b', '\xb6', '\x63', '\xa6', '\xb1', '\xb9', '\x4a', '\x54', + '\x0f', '\x5f', '\x80', '\xff', '\x63', '\xa6', '\x4f', '\xbc', + '\x98', '\x00', '\x4f', '\xcc', '\x55', '\x00', '\xb2', '\xb9', + '\x10', '\xe0', '\x0f', '\x05', '\x0f', '\x02', '\xe7', '\x04', + '\x60', '\xb6', '\xb1', '\xb9', '\xcf', '\xae', '\x03', '\x00', + '\x35', '\x35', '\x0a', '\x31', '\xd8', '\x8b', '\xc8', '\x82', + '\x12', '\xd0', '\x68', '\x46', '\x6f', '\xae', '\xd2', '\x19', + '\x00', '\x38', '\x3f', '\xbd', '\xda', '\x04', '\x00', '\x38', + '\xd2', '\xe0', '\x7a', '\x86', '\x65', '\x56', '\x94', '\x20', + '\x81', '\x42', '\x90', '\xe0', '\x74', '\x86', '\xc2', '\x03', + '\x60', '\xb6', '\x2f', '\xb2', '\xe7', '\xb4', '\x6f', '\x1e', + '\x88', '\x0b', '\x00', '\x38', '\x63', '\xa6', '\xb1', '\xb9', + '\x6a', '\x66', '\x60', '\xb6', '\x30', '\xb2', '\xe7', '\xb4', + '\x63', '\xa6', '\xb1', '\xb9', '\xc8', '\xa3', '\x6a', '\x67', + '\xc8', '\x63', '\x60', '\xb6', '\x2d', '\xb2', '\xe7', '\xb4', + '\x63', '\xa6', '\xb1', '\xb9', '\x6a', '\x26', '\x2e', '\x02', + '\xe7', '\x04', '\x63', '\xa6', '\x60', '\xb6', '\xb1', '\xb9', + '\xc8', '\xa3', '\x6a', '\x27', '\x65', '\x56', '\x0a', '\x30', + '\x01', '\x22', '\x68', '\x96', '\xa4', '\x96', '\x04', '\xe0', + '\x81', '\x92', '\x64', '\x96', '\x19', '\x95', '\x63', '\xd6', + '\x2d', '\x95', '\x6d', '\x96', '\x24', '\xe1', '\x6d', '\xda', + '\x0c', '\x91', '\xed', '\xdb', '\x10', '\x91', '\xe6', '\x6b', + '\x14', '\x91', '\xe2', '\x2b', '\x62', '\x26', '\x10', '\xd0', + '\x0f', '\x05', '\x24', '\xe1', '\x29', '\x6a', '\x24', '\xe1', + '\xe9', '\x9b', '\x81', '\x22', '\xf5', '\x20', '\x0f', '\x05', + '\x24', '\xe1', '\x6d', '\xda', '\x06', '\x31', '\xed', '\xda', + '\x1e', '\x30', '\x65', '\x56', '\x06', '\x30', '\x01', '\x42', + '\x81', '\x42', '\x81', '\x42', '\x65', '\x56', '\x0c', '\x30', + '\xe8', '\x46', '\x64', '\x46', '\x69', '\xa0', '\x64', '\x06', + '\x08', '\xe0', '\x63', '\xa6', '\x61', '\xb0', '\x64', '\x06', + '\x63', '\xa6', '\x4f', '\xbc', '\xf0', '\x00', '\x5f', '\xcc', + '\x55', '\x05', '\x3f', '\xbd', '\xd6', '\x0b', '\x00', '\x38', + '\x12', '\xe0', '\x41', '\xa2', '\x4f', '\xbc', '\xf0', '\x00', + '\x5f', '\xcc', '\x55', '\x05', '\x3f', '\xbd', '\xd6', '\x0b', + '\x00', '\x38', '\x7a', '\x86', '\xbe', '\x8f', '\x04', '\xe2', + '\x3e', '\x0d', '\xfc', '\xe1', '\x7e', '\xbe', '\x90', '\xe2', + '\xfe', '\x3b', '\x06', '\xa1', '\xa0', '\x0b', '\xff', '\x2d', + '\x16', '\x04', '\x6a', '\x26', '\x3f', '\xbd', '\xc2', '\x0c', + '\x00', '\x38', '\x6a', '\xa6', '\xff', '\x2d', '\x86', '\x03', + '\x41', '\xa2', '\x62', '\xa6', '\x3f', '\xbd', '\x1e', '\x0c', + '\x00', '\x38', '\x62', '\xa6', '\x4f', '\xbc', '\x90', '\x00', + '\x5f', '\xcc', '\x55', '\x05', '\x3f', '\xbd', '\xd6', '\x0b', + '\x00', '\x38', '\x6f', '\x1e', '\x88', '\x0b', '\x00', '\x38', + '\x62', '\xa6', '\x7b', '\x86', '\xb1', '\xb9', '\x6a', '\x36', + '\x04', '\x21', '\x40', '\xbe', '\x4b', '\xb4', '\x2b', '\xb6', + '\x62', '\xa6', '\xb1', '\xb9', '\x42', '\x92', '\xc0', '\x9a', + '\x1c', '\x20', '\x63', '\xc6', '\xf0', '\xc3', '\x53', '\x94', + '\xe9', '\xc6', '\x14', '\x20', '\x63', '\x06', '\x6a', '\xd6', + '\xf0', '\xd3', '\x5a', '\x94', '\xe9', '\xd6', '\x0a', '\x20', + '\xd0', '\x03', '\x6c', '\x36', '\x6d', '\xa6', '\x63', '\x06', + '\xd0', '\x03', '\x6a', '\x07', '\x62', '\xa6', '\x4f', '\xbc', + '\xf0', '\x00', '\x5f', '\xcc', '\x55', '\x05', '\x3f', '\xbd', + '\xd6', '\x0b', '\x00', '\x38', '\xef', '\x0e', '\xc0', '\x00', + '\x1f', '\x00', '\xff', '\x3d', '\x48', '\x02', '\x0f', '\x05', + '\x60', '\x90', '\x0f', '\x05', '\xef', '\x0e', '\xc4', '\x22', + '\x01', '\x00', '\xb0', '\x30', '\x0f', '\x05', '\x20', '\x90', + '\x0f', '\x05', '\xef', '\x0e', '\x58', '\x22', '\x01', '\x00', + '\xff', '\x3d', '\x5a', '\x01', '\x0f', '\x05', '\xef', '\x0e', + '\x5b', '\x22', '\x01', '\x00', '\xff', '\x3d', '\x4e', '\x01', + '\x0f', '\x05', '\xff', '\xed', '\xb6', '\x02', '\x0f', '\x05', + '\xef', '\x0e', '\xda', '\x22', '\x01', '\x00', '\xff', '\x3d', + '\x9c', '\x01', '\x0f', '\x05', '\x14', '\x90', '\x0f', '\x05', + '\xef', '\x0e', '\xd6', '\x22', '\x01', '\x00', '\xff', '\x3d', + '\x8c', '\x01', '\x0f', '\x05', '\xff', '\xed', '\x94', '\x02', + '\x0f', '\x05', '\xef', '\x0e', '\x49', '\x22', '\x04', '\x00', + '\xc4', '\x30', '\x0f', '\x05', '\xff', '\xed', '\x84', '\x02', + '\x0f', '\x05', '\xef', '\x0e', '\xd7', '\x00', '\x20', '\x00', + '\xff', '\x3d', '\x6a', '\x01', '\x0f', '\x05', '\x20', '\x90', + '\x0f', '\x05', '\xef', '\x0e', '\xc2', '\x00', '\x1f', '\x00', + '\xff', '\x3d', '\x00', '\x02', '\x0f', '\x05', '\xef', '\x0e', + '\xc9', '\x00', '\x1f', '\x00', '\xff', '\x3d', '\x18', '\x02', + '\x0f', '\x05', '\xff', '\xed', '\x56', '\x02', '\x0f', '\x05', + '\xef', '\x0e', '\x4f', '\x00', '\x98', '\x00', '\xff', '\x3d', + '\x3c', '\x01', '\x0f', '\x05', '\x12', '\x90', '\x0f', '\x05', + '\xef', '\x0e', '\x43', '\x00', '\x98', '\x00', '\x76', '\x30', + '\x0f', '\x05', '\xff', '\xed', '\x36', '\x02', '\x0f', '\x05', + '\xef', '\x0e', '\xc2', '\x00', '\x98', '\x00', '\xff', '\x2d', + '\x2a', '\x02', '\x0f', '\x05', '\x6f', '\x1e', '\xb6', '\x1a', + '\x00', '\x38', '\x61', '\x1a', '\x6f', '\xde', '\x00', '\x00', + '\x20', '\x00', '\x06', '\x21', '\xed', '\xdb', '\x0c', '\x21', + '\x70', '\x8a', '\x6f', '\x9e', '\x00', '\x00', '\x01', '\x00', + '\x10', '\x21', '\xe9', '\x9b', '\x5f', '\xd2', '\x14', '\x21', + '\xed', '\xdb', '\x6f', '\x9e', '\x00', '\x00', '\x1f', '\x00', + '\x18', '\x21', '\xe9', '\x9b', '\x1f', '\xdc', '\xe1', '\x7f', + '\x1c', '\x21', '\xed', '\xdb', '\x41', '\x92', '\x20', '\x21', + '\xe9', '\x9b', '\x6f', '\xde', '\x00', '\x80', '\x1f', '\x00', + '\x24', '\x21', '\xed', '\xdb', '\x5f', '\xdc', '\x00', '\x20', + '\x28', '\x21', '\xed', '\xdb', '\x42', '\xd2', '\x2c', '\x21', + '\xed', '\xdb', '\x6f', '\xde', '\x00', '\xc0', '\x1f', '\x00', + '\xff', '\xed', '\x16', '\x01', '\x0f', '\x05', '\x6f', '\x1e', + '\xb2', '\x1a', '\x00', '\x38', '\x61', '\x1a', '\x6f', '\x9e', + '\x00', '\x00', '\x20', '\x00', '\x06', '\x21', '\xe9', '\x9b', + '\x0c', '\x21', '\x70', '\x8a', '\x5f', '\x9c', '\x00', '\x40', + '\x10', '\x21', '\xe9', '\x9b', '\x41', '\xd2', '\x14', '\x21', + '\xed', '\xdb', '\x18', '\x21', '\xe9', '\x9b', '\x5f', '\x9c', + '\x00', '\x20', '\x1c', '\x21', '\xe9', '\x9b', '\x42', '\x92', + '\x20', '\x21', '\xe9', '\x9b', '\x1f', '\x9c', '\xfe', '\x7f', + '\x24', '\x21', '\xe9', '\x9b', '\x28', '\x21', '\xe9', '\x9b', + '\x2c', '\x21', '\xed', '\xdb', '\x6f', '\x9e', '\x00', '\x00', + '\x01', '\x00', '\x30', '\x21', '\xe9', '\x9b', '\x34', '\x21', + '\xe9', '\x9b', '\x58', '\xe0', '\x5f', '\xd2', '\x6f', '\x1e', + '\xaa', '\x1a', '\x00', '\x38', '\x61', '\x1a', '\x6f', '\x9e', + '\x00', '\x00', '\x10', '\x00', '\x06', '\x21', '\xe9', '\x9b', + '\x0c', '\x21', '\x70', '\x8a', '\x5f', '\x9c', '\x00', '\x40', + '\x10', '\x21', '\xe9', '\x9b', '\x41', '\xd2', '\x14', '\x21', + '\xed', '\xdb', '\x18', '\x21', '\xe9', '\x9b', '\x5f', '\x9c', + '\x00', '\x20', '\x1c', '\x21', '\xe9', '\x9b', '\x42', '\x92', + '\x20', '\x21', '\xe9', '\x9b', '\x1f', '\x9c', '\xfe', '\x7f', + '\x24', '\x21', '\xe9', '\x9b', '\x28', '\x21', '\xe9', '\x9b', + '\x2c', '\x21', '\xed', '\xdb', '\x6f', '\x9e', '\x00', '\x00', + '\x01', '\x00', '\x30', '\x21', '\xe9', '\x9b', '\x34', '\x21', + '\xe9', '\x9b', '\x4f', '\xd2', '\x38', '\x21', '\xed', '\xdb', + '\xff', '\xed', '\x3e', '\x01', '\x0f', '\x05', '\x6f', '\x1e', + '\xae', '\x1a', '\x00', '\x38', '\x61', '\x1a', '\x6f', '\x9e', + '\x00', '\x00', '\x10', '\x00', '\x06', '\x21', '\xe9', '\x9b', + '\x0c', '\x21', '\x70', '\x8a', '\x6f', '\xde', '\x00', '\x00', + '\x01', '\x00', '\x10', '\x21', '\xed', '\xdb', '\x4f', '\x92', + '\x14', '\x21', '\xe9', '\x9b', '\x6f', '\xde', '\x00', '\x00', + '\x0f', '\x00', '\x18', '\x21', '\xed', '\xdb', '\x1f', '\x9c', + '\xf1', '\x7f', '\x1c', '\x21', '\xe9', '\x9b', '\x41', '\x92', + '\x20', '\x21', '\xe9', '\x9b', '\x6f', '\xde', '\x00', '\x80', + '\x0f', '\x00', '\x24', '\x21', '\xed', '\xdb', '\x5f', '\xdc', + '\x00', '\x20', '\x28', '\x21', '\xed', '\xdb', '\x42', '\xd2', + '\x2c', '\x21', '\xed', '\xdb', '\x6f', '\xde', '\x00', '\xc0', + '\x0f', '\x00', '\x30', '\x21', '\xed', '\xdb', '\x5f', '\xdc', + '\x00', '\x40', '\x34', '\x21', '\xed', '\xdb', '\x38', '\x21', + '\xe9', '\x9b', '\xce', '\xe0', '\x0f', '\x05', '\x6f', '\x1e', + '\xb2', '\x1a', '\x00', '\x38', '\x61', '\x1a', '\x6f', '\x9e', + '\x00', '\x00', '\x20', '\x00', '\x06', '\x21', '\xe9', '\x9b', + '\x0c', '\x21', '\x70', '\x8a', '\x5f', '\xdc', '\x00', '\x20', + '\x10', '\x21', '\xed', '\xdb', '\x48', '\x92', '\x14', '\x21', + '\xe9', '\x9b', '\x6f', '\x9e', '\x00', '\x00', '\x01', '\x00', + '\x18', '\x21', '\xe9', '\x9b', '\x1c', '\x21', '\xe9', '\x9b', + '\x62', '\xe0', '\x5f', '\xd2', '\x6f', '\x1e', '\xb6', '\x1a', + '\x00', '\x38', '\x61', '\x1a', '\x6f', '\x9e', '\x00', '\x00', + '\x20', '\x00', '\x06', '\x21', '\xe9', '\x9b', '\x0c', '\x21', + '\x70', '\x8a', '\x6f', '\xde', '\x00', '\x00', '\x01', '\x00', + '\x10', '\x21', '\xed', '\xdb', '\x26', '\xe0', '\x5f', '\x92', + '\x6f', '\x1e', '\xba', '\x1a', '\x00', '\x38', '\x61', '\x1a', + '\x6f', '\x9e', '\x00', '\x00', '\x40', '\x00', '\x06', '\x21', + '\xe9', '\x9b', '\x0c', '\x21', '\x70', '\x8a', '\x6f', '\xde', + '\x00', '\x00', '\x01', '\x00', '\x10', '\x21', '\xed', '\xdb', + '\x4f', '\x9c', '\x3f', '\x00', '\x14', '\x21', '\xe9', '\x9b', + '\x6f', '\xde', '\x00', '\x00', '\x1f', '\x00', '\x18', '\x21', + '\xed', '\xdb', '\x5f', '\x9c', '\x00', '\x20', '\x1c', '\x21', + '\xe9', '\x9b', '\x48', '\xd2', '\x20', '\x21', '\xed', '\xdb', + '\x30', '\xe0', '\x0f', '\x05', '\x04', '\x21', '\x49', '\x9a', + '\x6f', '\xae', '\xee', '\x19', '\x00', '\x38', '\xcf', '\x9e', + '\x01', '\x00', '\x08', '\x30', '\x0f', '\x05', '\x6f', '\xae', + '\x00', '\x1a', '\x00', '\x38', '\x3f', '\xbd', '\xda', '\x04', + '\x00', '\x38', '\x62', '\xaa', '\x41', '\xb2', '\x3f', '\xbd', + '\x20', '\x05', '\x00', '\x38', '\x7a', '\x86', '\xbe', '\x3f', + '\x3e', '\x0d', '\x6f', '\x3e', '\xda', '\x04', '\x00', '\x38', + '\x6f', '\xae', '\x18', '\x1a', '\x00', '\x38', '\xb3', '\xb9', + '\x04', '\x21', '\x40', '\x9e', '\xcf', '\x9e', '\x01', '\x00', + '\x0c', '\x20', '\x42', '\xd2', '\x6f', '\xae', '\x20', '\x1a', + '\x00', '\x38', '\xb3', '\xb9', '\x42', '\xd2', '\xc0', '\xda', + '\x32', '\x20', '\x47', '\xc2', '\x06', '\x21', '\x6d', '\x9e', + '\xc1', '\x93', '\xed', '\x9b', '\x62', '\xd6', '\x0c', '\xd1', + '\x69', '\x9a', '\xc1', '\x93', '\x0c', '\xd1', '\xe9', '\x9b', + '\x10', '\xd1', '\x69', '\x9a', '\xc1', '\x93', '\x10', '\xd1', + '\xe9', '\x9b', '\x81', '\xc2', '\xe9', '\x60', '\x0c', '\xd2', + '\x6f', '\xae', '\x22', '\x1a', '\x00', '\x38', '\x3f', '\xbd', + '\xda', '\x04', '\x00', '\x38', '\x6f', '\x0e', '\xda', '\x04', + '\x00', '\x38', '\x6f', '\xae', '\x24', '\x1a', '\x00', '\x38', + '\xb0', '\xb9', '\x61', '\xa6', '\xb0', '\xb9', '\x6f', '\xae', + '\x56', '\x19', '\x00', '\x38', '\xb0', '\xb9', '\x62', '\xaa', + '\x41', '\xb2', '\x3f', '\xbd', '\x20', '\x05', '\x00', '\x38', + '\x41', '\xa2', '\xbe', '\x3f', '\x3e', '\x0d', '\xfc', '\xe1', + '\x7e', '\xbe', '\x8c', '\xe2', '\xfe', '\x2b', '\x6a', '\x16', + '\x6b', '\x26', '\x6f', '\x0e', '\x1e', '\x0c', '\x00', '\x38', + '\xb0', '\xb9', '\x61', '\xa6', '\x4f', '\xbc', '\x80', '\x00', + '\x5f', '\xcc', '\x55', '\x05', '\x3f', '\xbd', '\xd6', '\x0b', + '\x00', '\x38', '\x61', '\xa6', '\xb0', '\xb9', '\x04', '\x11', + '\x49', '\x9a', '\xcf', '\x9e', '\x02', '\x00', '\x10', '\x20', + '\x0f', '\x05', '\x6f', '\x9e', '\x30', '\x00', '\x30', '\x00', + '\x61', '\x29', '\xe9', '\x9b', '\xbe', '\x2f', '\x3e', '\x0d', + '\x4f', '\x9c', '\x30', '\x00', '\x61', '\x29', '\xd9', '\x9b', + '\xbe', '\x2f', '\x3e', '\x0d', '\x84', '\xe2', '\xfe', '\x0b', + '\x06', '\xa1', '\xeb', '\xba', '\x10', '\x10', '\x0f', '\x05', + '\x7a', '\x86', '\x7f', '\xb6', '\xbe', '\x0f', '\x10', '\xa1', + '\x6a', '\xaa', '\x7f', '\xb6', '\xbe', '\x0f', '\x70', '\x86', + '\x0c', '\xa1', '\xeb', '\xba', '\x22', '\x10', '\x7d', '\x86', + '\x14', '\xa1', '\xed', '\xda', '\x10', '\x00', '\x79', '\x86', + '\x10', '\xa1', '\x6c', '\xca', '\x01', '\x92', '\x14', '\xa1', + '\xe9', '\x9a', '\xf9', '\x10', '\x2c', '\xd6', '\x0c', '\xa1', + '\x29', '\xda', '\xe9', '\xb6', '\xd1', '\x10', '\x0f', '\x05', + '\x01', '\x02', '\xc7', '\x02', '\xd3', '\x80', '\x0c', '\xa2', + '\x7a', '\x86', '\x7f', '\xb6', '\xbe', '\x0f', '\x84', '\xe2', + '\xfe', '\x0b', '\x6a', '\x06', '\x6b', '\xa6', '\x6d', '\xb6', + '\x7d', '\x86', '\xeb', '\xd6', '\x48', '\xa0', '\x0f', '\x05', + '\x60', '\x9a', '\x2d', '\x96', '\x49', '\xa5', '\x59', '\x9a', + '\x4c', '\xd5', '\xd9', '\x9a', '\x32', '\x30', '\x02', '\xd2', + '\x82', '\xd2', '\x6b', '\x96', '\x2a', '\x96', '\xe9', '\xa6', + '\x20', '\x00', '\x6a', '\xc6', '\x60', '\xc9', '\x59', '\x9a', + '\xdf', '\x9e', '\xff', '\xff', '\x0a', '\x30', '\x02', '\xc2', + '\x82', '\xc2', '\x42', '\xa2', '\x7f', '\xb6', '\xbe', '\x0f', + '\x6b', '\x96', '\x2a', '\x96', '\xe9', '\xc6', '\xe5', '\x10', + '\x0f', '\x05', '\x41', '\xa2', '\x7f', '\xb6', '\xbe', '\x0f', + '\xeb', '\xd6', '\xbd', '\xb0', '\x0f', '\x05', '\x7a', '\x86', + '\x7f', '\xb6', '\xbe', '\x0f', '\xfc', '\xe1', '\x7e', '\xbe', + '\x90', '\xe2', '\xfe', '\x3b', '\x73', '\x86', '\x72', '\x86', + '\x6f', '\x0e', '\xbe', '\x1a', '\x00', '\x38', '\x41', '\x12', + '\x04', '\x01', '\xc1', '\x1b', '\xcf', '\x1e', '\x01', '\x00', + '\x04', '\x30', '\x42', '\x92', '\x44', '\x92', '\x05', '\x01', + '\xc9', '\x9b', '\x60', '\xa6', '\x3f', '\xbd', '\xb2', '\x0e', + '\x00', '\x38', '\x6a', '\xa6', '\x0c', '\x20', '\x0f', '\x05', + '\xc1', '\x13', '\xcf', '\x1e', '\x03', '\x00', '\xd9', '\x80', + '\x0f', '\x05', '\x06', '\x01', '\x23', '\x3a', '\x0f', '\x0c', + '\x6c', '\x00', '\x01', '\x22', '\xc1', '\x22', '\xc7', '\x80', + '\x63', '\xa6', '\xbe', '\x3f', '\x3e', '\x0d', '\xfc', '\xe1', + '\x7e', '\xbe', '\x98', '\xe2', '\xfe', '\x5b', '\x6a', '\x16', + '\x6b', '\x56', '\x6c', '\x36', '\x70', '\x86', '\xed', '\x06', + '\x74', '\xa0', '\x6d', '\x46', '\x05', '\x11', '\x49', '\x9a', + '\xcf', '\x9e', '\x02', '\x00', '\x12', '\x20', '\x0f', '\x05', + '\x43', '\x05', '\x59', '\x9a', '\xdf', '\x9e', '\xff', '\xff', + '\x54', '\x30', '\x42', '\x22', '\x05', '\x11', '\x49', '\x9a', + '\xcf', '\x9e', '\x04', '\x00', '\x0e', '\x20', '\x61', '\xa6', + '\x43', '\x05', '\x69', '\x9a', '\xff', '\x92', '\x3e', '\x30', + '\x44', '\x22', '\x61', '\xa6', '\x3f', '\xbd', '\x1e', '\x0c', + '\x00', '\x38', '\x61', '\xa6', '\x4f', '\xbc', '\xa0', '\x00', + '\x5f', '\xcc', '\x55', '\x05', '\x3f', '\xbd', '\xd6', '\x0b', + '\x00', '\x38', '\x65', '\xb6', '\x20', '\xb6', '\x63', '\xc6', + '\x20', '\xc6', '\x61', '\xa6', '\x3f', '\xbd', '\xaa', '\x0b', + '\x00', '\x38', '\x6a', '\x26', '\x61', '\xa6', '\x65', '\xb6', + '\x20', '\xb6', '\x3f', '\xbd', '\x4a', '\x0c', '\x00', '\x38', + '\x6a', '\xa6', '\xf3', '\x20', '\x61', '\xa6', '\x22', '\x06', + '\xe4', '\x06', '\x91', '\xb0', '\x0f', '\x05', '\xbe', '\x5f', + '\x3e', '\x0d', '\xfc', '\xe1', '\x7e', '\xbe', '\xa4', '\xe2', + '\xfe', '\x8b', '\x6a', '\x16', '\x6b', '\x06', '\x6c', '\x86', + '\x3f', '\xbd', '\xdc', '\x13', '\x00', '\x38', '\x6a', '\x96', + '\x1a', '\x30', '\x41', '\xa2', '\x60', '\xd6', '\x28', '\xd6', + '\xe9', '\xd6', '\x14', '\x80', '\x0f', '\x05', '\x6f', '\xae', + '\x28', '\x1a', '\x00', '\x38', '\x3f', '\xbd', '\xda', '\x04', + '\x00', '\x38', '\x42', '\xa2', '\xbe', '\x8f', '\x3e', '\x0d', + '\x6f', '\xce', '\xc4', '\x1a', '\x00', '\x38', '\x6c', '\xca', + '\xec', '\x06', '\x1e', '\x10', '\xec', '\xd6', '\x6f', '\x9e', + '\x96', '\x1b', '\x00', '\x38', '\x09', '\x91', '\x70', '\x8a', + '\x16', '\x91', '\xe1', '\x1b', '\xac', '\x06', '\x1a', '\x91', + '\xe0', '\x0b', '\x1e', '\x91', '\xe8', '\x8b', '\x74', '\xe0', + '\x0f', '\x05', '\x5a', '\x80', '\x6c', '\x96', '\x6f', '\xde', + '\x96', '\x1b', '\x00', '\x38', '\x01', '\xd1', '\xe1', '\x1b', + '\x05', '\xd1', '\xe0', '\x0b', '\xa0', '\x96', '\x09', '\xd1', + '\xe9', '\x9b', '\x29', '\x16', '\x16', '\xd1', '\xe1', '\x1b', + '\x1a', '\xd1', '\x70', '\x8a', '\x68', '\xc6', '\xa9', '\xc6', + '\x1e', '\xd1', '\xec', '\xcb', '\x46', '\xe0', '\x0f', '\x05', + '\x6f', '\xae', '\x44', '\x1a', '\x00', '\x38', '\x3f', '\xbd', + '\xda', '\x04', '\x00', '\x38', '\x44', '\xa2', '\xbe', '\x8f', + '\x3e', '\x0d', '\x6f', '\xae', '\x58', '\x1a', '\x00', '\x38', + '\x3f', '\xbd', '\xda', '\x04', '\x00', '\x38', '\x60', '\xa6', + '\x41', '\xb2', '\x3f', '\xbd', '\x20', '\x05', '\x00', '\x38', + '\x43', '\xa2', '\xbe', '\x8f', '\x3e', '\x0d', '\x6f', '\x9e', + '\x96', '\x1b', '\x00', '\x38', '\x01', '\x91', '\xe1', '\x1b', + '\x05', '\x91', '\xe0', '\x0b', '\x09', '\x91', '\xe8', '\x8b', + '\x1e', '\x91', '\x70', '\x8a', '\x6f', '\xce', '\x96', '\x1b', + '\x00', '\x38', '\x7c', '\x0a', '\x0d', '\xc1', '\x70', '\x8a', + '\x11', '\xc1', '\x70', '\x8a', '\x15', '\xc1', '\x79', '\x0e', + '\x7f', '\x0d', '\xb8', '\x1b', '\x00', '\x38', '\x70', '\x8a', + '\x7f', '\x0d', '\xbc', '\x1b', '\x00', '\x38', '\x70', '\x8a', + '\x0d', '\x91', '\xe8', '\x8a', '\xff', '\x8d', '\xc0', '\x01', + '\x75', '\x86', '\x65', '\x56', '\x04', '\x20', '\x6c', '\xd6', + '\x15', '\xd2', '\x65', '\x96', '\x29', '\x55', '\x65', '\x36', + '\x23', '\x95', '\x09', '\xd1', '\x69', '\x9a', '\x24', '\x30', + '\x2c', '\x36', '\x0d', '\xd1', '\xe9', '\x9a', '\x1c', '\x80', + '\x0f', '\x05', '\x09', '\x31', '\x69', '\x9a', '\x10', '\x30', + '\x0f', '\x05', '\x83', '\x0b', '\x0a', '\x20', '\x0f', '\x05', + '\x0d', '\x31', '\xe9', '\x9a', '\x06', '\x20', '\x0f', '\x05', + '\x65', '\x56', '\x35', '\x35', '\x11', '\x31', '\x63', '\x3a', + '\xca', '\x32', '\x4d', '\x90', '\x65', '\x96', '\x29', '\x55', + '\x65', '\x36', '\x23', '\x95', '\x2f', '\x3e', '\x96', '\x1b', + '\x00', '\x38', '\x05', '\x31', '\x64', '\x4a', '\x0d', '\x31', + '\x69', '\x9a', '\x29', '\x46', '\x01', '\x31', '\x27', '\x9a', + '\x65', '\xa6', '\xc3', '\xa3', '\xa5', '\xa6', '\xc2', '\xa3', + '\xa5', '\xa6', '\xc2', '\xa3', '\x2f', '\xae', '\xbe', '\x1a', + '\x00', '\x38', '\x64', '\xb6', '\x3f', '\xbd', '\x2c', '\x13', + '\x00', '\x38', '\x83', '\x0b', '\x24', '\x30', '\x6a', '\x66', + '\x65', '\xa6', '\xc3', '\xa3', '\xa5', '\xa6', '\xc2', '\xa3', + '\xa5', '\xa6', '\xc2', '\xa3', '\x2f', '\xae', '\xbe', '\x1a', + '\x00', '\x38', '\x64', '\xb6', '\x3f', '\xbd', '\x4a', '\x0c', + '\x00', '\x38', '\x6a', '\xa6', '\xe5', '\x20', '\x65', '\xa6', + '\x73', '\x0a', '\x65', '\x26', '\xc3', '\x23', '\xa5', '\x26', + '\xc2', '\x23', '\xa5', '\x26', '\xc2', '\x23', '\x2f', '\x2e', + '\xbe', '\x1a', '\x00', '\x38', '\x62', '\xa6', '\x4f', '\xbc', + '\xf0', '\x00', '\x5f', '\xcc', '\x55', '\x05', '\x3f', '\xbd', + '\xd6', '\x0b', '\x00', '\x38', '\x62', '\xa6', '\x64', '\xb6', + '\x67', '\xc6', '\x66', '\xd6', '\x3f', '\xbd', '\x7e', '\x13', + '\x00', '\x38', '\x4a', '\xa6', '\x28', '\x20', '\x7b', '\x86', + '\x0d', '\x31', '\x69', '\xde', '\x26', '\xd6', '\xe9', '\xdb', + '\x11', '\x31', '\x70', '\x8a', '\x62', '\xaa', '\x24', '\xa6', + '\x3f', '\xbd', '\x20', '\x05', '\x00', '\x38', '\x6f', '\xae', + '\x62', '\x1a', '\x00', '\x38', '\x3f', '\xbd', '\xda', '\x04', + '\x00', '\x38', '\xaa', '\xe0', '\x0f', '\x05', '\xcf', '\xae', + '\x01', '\x00', '\x4c', '\x30', '\x0f', '\x05', '\xcf', '\xae', + '\x02', '\x00', '\x46', '\x20', '\x65', '\xa6', '\x62', '\xaa', + '\x24', '\xa6', '\x6f', '\x1e', '\x20', '\x05', '\x00', '\x38', + '\x7b', '\x86', '\xb1', '\xb9', '\x6f', '\x0e', '\xda', '\x04', + '\x00', '\x38', '\x6f', '\xae', '\x76', '\x1a', '\x00', '\x38', + '\xb0', '\xb9', '\x66', '\xa6', '\x7b', '\x86', '\xb1', '\xb9', + '\x6f', '\xae', '\x82', '\x1a', '\x00', '\x38', '\xb0', '\xb9', + '\x62', '\xa6', '\x64', '\xb6', '\x3f', '\xbd', '\xde', '\x12', + '\x00', '\x38', '\x41', '\x92', '\xc3', '\x9b', '\x11', '\x31', + '\x6d', '\x9e', '\x01', '\x92', '\x58', '\xe0', '\xed', '\x9b', + '\x65', '\xa6', '\xc3', '\xa3', '\xa5', '\xa6', '\xc2', '\xa3', + '\xa5', '\xa6', '\xc2', '\xa3', '\x6f', '\xad', '\xbe', '\x1a', + '\x00', '\x38', '\x62', '\xae', '\x24', '\xa6', '\x6f', '\x1e', + '\x20', '\x05', '\x00', '\x38', '\x7b', '\x86', '\xb1', '\xb9', + '\x6f', '\x0e', '\xda', '\x04', '\x00', '\x38', '\x6f', '\xae', + '\x8a', '\x1a', '\x00', '\x38', '\xb0', '\xb9', '\x66', '\xa6', + '\x7b', '\x86', '\xb1', '\xb9', '\x6f', '\xae', '\x82', '\x1a', + '\x00', '\x38', '\xb0', '\xb9', '\x62', '\xa6', '\x64', '\xb6', + '\x67', '\xc6', '\x66', '\xd6', '\x3f', '\xbd', '\x2e', '\x14', + '\x00', '\x38', '\x0d', '\x31', '\x6d', '\x9e', '\x26', '\x96', + '\xed', '\x9b', '\x11', '\x31', '\x70', '\x8a', '\x6f', '\xce', + '\x96', '\x1b', '\x00', '\x38', '\x0d', '\xc1', '\x69', '\x9a', + '\x7f', '\x0d', '\xb8', '\x1b', '\x00', '\x38', '\x29', '\x9a', + '\xe8', '\x96', '\xff', '\x1d', '\x44', '\xfe', '\x0f', '\x05', + '\x75', '\x86', '\x6f', '\x2e', '\xbe', '\x1a', '\x00', '\x38', + '\x6f', '\x1e', '\x96', '\x1b', '\x00', '\x38', '\x09', '\x11', + '\xa0', '\x0b', '\x4c', '\x30', '\x7b', '\x86', '\x62', '\xaa', + '\x3f', '\xbd', '\x20', '\x05', '\x00', '\x38', '\x6f', '\xae', + '\x96', '\x1a', '\x00', '\x38', '\x3f', '\xbd', '\xda', '\x04', + '\x00', '\x38', '\x70', '\x86', '\x09', '\x11', '\xe0', '\x0a', + '\x22', '\x00', '\x0f', '\x05', '\x05', '\x11', '\x29', '\x0a', + '\x01', '\x11', '\x6d', '\xda', '\x62', '\x99', '\x59', '\x9a', + '\x4d', '\x05', '\xd9', '\x9a', '\xff', '\x2d', '\x9a', '\xfd', + '\x0f', '\x05', '\x02', '\x02', '\x09', '\x11', '\xe0', '\x0a', + '\xe3', '\x10', '\x0f', '\x05', '\x6f', '\xae', '\xa6', '\x1a', + '\x00', '\x38', '\x3f', '\xbd', '\xda', '\x04', '\x00', '\x38', + '\x0f', '\x2c', '\x6c', '\x00', '\x01', '\x52', '\xc1', '\x52', + '\xa5', '\x80', '\x15', '\x12', '\x7a', '\x86', '\xbe', '\x8f', + '\x3e', '\x0d', '\x00', '\x00', '\x7f', '\xb6', '\x0f', '\x05', + '\x00', '\x00', '\x00', '\x00', '\x0d', '\x0a', '\x0d', '\x0a', + '\x44', '\x65', '\x76', '\x69', '\x63', '\x65', '\x20', '\x49', + '\x44', '\x20', '\x3d', '\x20', '\x00', '\x00', '\x43', '\x68', + '\x65', '\x63', '\x6b', '\x73', '\x75', '\x6d', '\x20', '\x6f', + '\x66', '\x20', '\x62', '\x6f', '\x6f', '\x74', '\x6c', '\x6f', + '\x61', '\x64', '\x65', '\x72', '\x20', '\x69', '\x73', '\x20', + '\x00', '\x00', '\x57', '\x61', '\x69', '\x74', '\x69', '\x6e', + '\x67', '\x20', '\x66', '\x6f', '\x72', '\x20', '\x6c', '\x6f', + '\x61', '\x64', '\x20', '\x69', '\x6e', '\x66', '\x6f', '\x2e', + '\x0d', '\x0a', '\x00', '\x00', '\x47', '\x6f', '\x74', '\x20', + '\x6c', '\x6f', '\x61', '\x64', '\x20', '\x69', '\x6e', '\x66', + '\x6f', '\x2e', '\x0d', '\x0a', '\x00', '\x00', '\x50', '\x41', + '\x43', '\x4b', '\x45', '\x54', '\x5f', '\x49', '\x4e', '\x46', + '\x4f', '\x0d', '\x0a', '\x00', '\x53', '\x45', '\x54', '\x5f', + '\x52', '\x45', '\x47', '\x49', '\x53', '\x54', '\x45', '\x52', + '\x0d', '\x0a', '\x00', '\x00', '\x47', '\x45', '\x54', '\x5f', + '\x52', '\x45', '\x47', '\x49', '\x53', '\x54', '\x45', '\x52', + '\x0d', '\x0a', '\x00', '\x00', '\x50', '\x41', '\x55', '\x53', + '\x45', '\x5f', '\x4c', '\x4f', '\x4f', '\x50', '\x0d', '\x0a', + '\x00', '\x00', '\x4d', '\x45', '\x4d', '\x5f', '\x56', '\x45', + '\x52', '\x49', '\x46', '\x59', '\x0d', '\x0a', '\x00', '\x00', + '\x76', '\x65', '\x72', '\x69', '\x66', '\x79', '\x20', '\x66', + '\x61', '\x69', '\x6c', '\x65', '\x64', '\x0d', '\x0a', '\x00', + '\x4d', '\x45', '\x4d', '\x5f', '\x54', '\x45', '\x53', '\x54', + '\x0d', '\x0a', '\x00', '\x00', '\x23', '\x23', '\x23', '\x20', + '\x4d', '\x65', '\x6d', '\x6f', '\x72', '\x79', '\x20', '\x74', + '\x65', '\x73', '\x74', '\x20', '\x66', '\x61', '\x69', '\x6c', + '\x65', '\x64', '\x20', '\x61', '\x74', '\x20', '\x00', '\x00', + '\x50', '\x61', '\x73', '\x73', '\x65', '\x64', '\x20', '\x6d', + '\x65', '\x6d', '\x6f', '\x72', '\x79', '\x20', '\x74', '\x65', + '\x73', '\x74', '\x2e', '\x0d', '\x0a', '\x00', '\x4d', '\x45', + '\x4d', '\x5f', '\x44', '\x55', '\x4d', '\x50', '\x0d', '\x0a', + '\x00', '\x00', '\x4d', '\x45', '\x4d', '\x5f', '\x43', '\x4c', + '\x45', '\x41', '\x52', '\x0d', '\x0a', '\x00', '\x46', '\x4c', + '\x41', '\x53', '\x48', '\x0d', '\x0a', '\x00', '\x4a', '\x55', + '\x4d', '\x50', '\x0d', '\x0a', '\x00', '\x00', '\x45', '\x4e', + '\x44', '\x0d', '\x0a', '\x00', '\x23', '\x23', '\x23', '\x20', + '\x55', '\x6e', '\x6b', '\x6e', '\x6f', '\x77', '\x6e', '\x20', + '\x74', '\x79', '\x70', '\x65', '\x3a', '\x20', '\x00', '\x00', + '\x43', '\x68', '\x65', '\x63', '\x6b', '\x73', '\x75', '\x6d', + '\x20', '\x6f', '\x66', '\x20', '\x66', '\x69', '\x6c', '\x65', + '\x20', '\x69', '\x73', '\x20', '\x00', '\x00', '\x23', '\x23', + '\x23', '\x20', '\x4d', '\x65', '\x6d', '\x6f', '\x72', '\x79', + '\x20', '\x74', '\x65', '\x73', '\x74', '\x20', '\x31', '\x20', + '\x66', '\x61', '\x69', '\x6c', '\x65', '\x64', '\x20', '\x61', + '\x74', '\x20', '\x00', '\x00', '\x23', '\x23', '\x23', '\x20', + '\x4d', '\x65', '\x6d', '\x6f', '\x72', '\x79', '\x20', '\x74', + '\x65', '\x73', '\x74', '\x20', '\x32', '\x20', '\x66', '\x61', + '\x69', '\x6c', '\x65', '\x64', '\x20', '\x61', '\x74', '\x20', + '\x00', '\x00', '\x20', '\x3a', '\x00', '\x00', '\x38', '\x4d', + '\x62', '\x20', '\x42', '\x42', '\x00', '\x00', '\x38', '\x4d', + '\x62', '\x20', '\x54', '\x42', '\x00', '\x00', '\x31', '\x36', + '\x4d', '\x62', '\x20', '\x42', '\x42', '\x00', '\x31', '\x36', + '\x4d', '\x62', '\x20', '\x54', '\x42', '\x00', '\x33', '\x32', + '\x4d', '\x62', '\x20', '\x54', '\x42', '\x00', '\x55', '\x6e', + '\x73', '\x75', '\x70', '\x70', '\x6f', '\x72', '\x74', '\x65', + '\x64', '\x20', '\x69', '\x6e', '\x74', '\x65', '\x72', '\x6c', + '\x65', '\x61', '\x76', '\x65', '\x21', '\x0a', '\x00', '\x00', + '\x46', '\x6f', '\x75', '\x6e', '\x64', '\x20', '\x31', '\x20', + '\x78', '\x20', '\x43', '\x46', '\x49', '\x20', '\x61', '\x74', + '\x20', '\x00', '\x54', '\x6f', '\x6f', '\x20', '\x6d', '\x61', + '\x6e', '\x79', '\x20', '\x72', '\x65', '\x67', '\x69', '\x6f', + '\x6e', '\x73', '\x20', '\x6f', '\x6e', '\x20', '\x63', '\x68', + '\x69', '\x70', '\x21', '\x0a', '\x00', '\x00', '\x4e', '\x6f', + '\x20', '\x73', '\x69', '\x6e', '\x67', '\x6c', '\x65', '\x20', + '\x78', '\x31', '\x36', '\x20', '\x61', '\x74', '\x20', '\x00', + '\x4e', '\x6f', '\x20', '\x69', '\x6e', '\x74', '\x65', '\x72', + '\x6c', '\x65', '\x61', '\x76', '\x65', '\x64', '\x20', '\x78', + '\x31', '\x36', '\x20', '\x61', '\x74', '\x20', '\x00', '\x00', + '\x46', '\x6f', '\x75', '\x6e', '\x64', '\x20', '\x00', '\x00', + '\x31', '\x00', '\x32', '\x00', '\x20', '\x78', '\x20', '\x00', + '\x46', '\x61', '\x74', '\x61', '\x6c', '\x3a', '\x20', '\x66', + '\x6c', '\x61', '\x73', '\x68', '\x20', '\x69', '\x73', '\x20', + '\x74', '\x6f', '\x6f', '\x20', '\x73', '\x6d', '\x61', '\x6c', + '\x6c', '\x2e', '\x0a', '\x00', '\x53', '\x65', '\x63', '\x74', + '\x6f', '\x72', '\x20', '\x65', '\x72', '\x61', '\x73', '\x65', + '\x20', '\x65', '\x72', '\x72', '\x6f', '\x72', '\x0a', '\x00', + '\x45', '\x72', '\x72', '\x6f', '\x72', '\x20', '\x61', '\x74', + '\x20', '\x00', '\x3a', '\x20', '\x4e', '\x6f', '\x20', '\x6e', + '\x65', '\x65', '\x64', '\x20', '\x74', '\x6f', '\x20', '\x77', + '\x72', '\x69', '\x74', '\x65', '\x0a', '\x00', '\x3a', '\x20', + '\x45', '\x72', '\x61', '\x73', '\x69', '\x6e', '\x67', '\x20', + '\x00', '\x00', '\x20', '\x62', '\x79', '\x74', '\x65', '\x73', + '\x0a', '\x00', '\x3a', '\x20', '\x57', '\x72', '\x69', '\x74', + '\x69', '\x6e', '\x67', '\x20', '\x00', '\x00', '\x3a', '\x20', + '\x56', '\x65', '\x72', '\x69', '\x66', '\x79', '\x69', '\x6e', + '\x67', '\x2e', '\x2e', '\x2e', '\x00', '\x00', '\x4f', '\x4b', + '\x0a', '\x00', '\x7e', '\x19', '\x00', '\x38', '\x86', '\x19', + '\x00', '\x38', '\x8e', '\x19', '\x00', '\x38', '\x96', '\x19', + '\x00', '\x38', '\x9e', '\x19', '\x00', '\x38', '\x00', '\x00', + '\x00', '\x80', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x84', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x54', '\x68', '\x69', '\x73', '\x20', '\x62', '\x6f', '\x6f', + '\x74', '\x6c', '\x6f', '\x61', '\x64', '\x65', '\x72', '\x20', + '\x77', '\x61', '\x73', '\x20', '\x62', '\x75', '\x69', '\x6c', + '\x74', '\x20', '\x62', '\x79', '\x20', '\x72', '\x6f', '\x6f', + '\x74', '\x20', '\x6f', '\x6e', '\x20', '\x57', '\x65', '\x64', + '\x20', '\x4d', '\x61', '\x79', '\x20', '\x31', '\x36', '\x20', + '\x32', '\x31', '\x3a', '\x33', '\x31', '\x3a', '\x34', '\x33', + '\x20', '\x43', '\x45', '\x53', '\x54', '\x20', '\x32', '\x30', + '\x30', '\x37', '\x2e', '\x0d', '\x0a', '\x00' +}; diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/network.c b/target/linux/etrax-2.6/image/e100boot/src/sbl/network.c new file mode 100644 index 0000000000..7c77d5e528 --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/network.c @@ -0,0 +1,706 @@ +/*!*************************************************************************** +*! +*! FILE NAME : network.c +*! +*! DESCRIPTION: Network boot stuff for e100boot. +*! +*! --------------------------------------------------------------------------- +*! HISTORY +*! +*! DATE NAME CHANGES +*! ---- ---- ------- +*! 1996 Ronny Raneup Initial version +*! 2002 05 02 Ronny Ranerup Moved it into this file +*! --------------------------------------------------------------------------- +*! (C) Copyright 1999, 2000, 2001, 2002 Axis Communications AB, LUND, SWEDEN +*!***************************************************************************/ + +/************************** Include files ********************************/ + +#include +#include +#include /* from configure */ + +#include +#include +#include + +/************************** Constants and macros *************************/ + +#define CRC_LEN 4 + +/************************** Type definitions *****************************/ + +/************************** Global variables *****************************/ + +udword highest_ack_received; +udword last_ack_received = -1; +int new_ack = FALSE; +int got_new_packet = FALSE; + +unsigned char dst_addr_of_device[] = { 0x01, 0x40, 0x8c, 0x00, 0x01, 0x00 }; +unsigned char src_addr_of_device[] = { 0x02, 0x40, 0x8c, 0x00, 0x01, 0x00 }; +unsigned char eth_addr_local[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + +struct sockaddr sock_addr; +int sock_fd; +int pPacket = 0; +pcap_t *pd; + +pcap_handler handler; + +struct packet_buf first_rec_packet; +struct packet_buf *last_rec_packet = &first_rec_packet; + +int promisc = 1; /* promiscuous mode */ +int all_ids = TRUE; + +int both_addresses = FALSE; +int p_packet_bpl = 8; +int printPacketType = CHAR; + +unsigned int id; +int one_id_only = TRUE; + +unsigned char buf[10000]; /* pcap buffer */ + +const struct pcap_pkthdr *hdrG; + +char host1[MAX_STRING_LEN]; /* name of ethernet host */ +char host2[MAX_STRING_LEN]; /* name of ethernet host */ + +/************************** Function prototypes **************************/ + +int timeout (struct timeval *tvThen, int ms); +int InitSendSocket (char *device_name); +int highest_seq_received (void); +struct packet_buf* ack_on_seq (int seq); +struct packet_buf* packet_with_seq (int seq); +struct timeval timeval_subtract (struct timeval *x, struct timeval *y); +void GetNextPacket (void); +void PrintPacket (const unsigned char *p, int size, int type); + +/**************************************************************************** +*# +*# FUNCTION NAME: net_init +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 2002 05 02 ronny Initial version +*# +*#***************************************************************************/ +void +net_init(void) +{ + static char *dev; + static char errBuf[1000]; + + GetLocalEthAddr(); + first_rec_packet.data = malloc(PACKET_SIZE); + + if ((dev = pcap_lookupdev(errBuf)) == NULL) { + printf("Error %s\n", errBuf); + if (errno == EPERM) + { + printf("Make sure this program is executed with root privileges.\n"); + } + + exit(EXIT_FAILURE); + } + + if ((pd = pcap_open_live(device, 200, promisc, 10, errBuf)) == NULL) { + printf("Error %s\n", errBuf); + if (errno == EPERM) + { + printf("Make sure this program is executed with root privileges.\n"); + } + + exit(EXIT_FAILURE); + } + + handler = (pcap_handler) Handler; + + InitSendSocket(device); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: NetBoot +*# +*# DESCRIPTION: The main network boot routine. +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 2000 01 07 ronny Initial version +*# 2002 05 02 ronny Fixed segv bug +*# +*#***************************************************************************/ + +void +NetBoot(void) +{ + struct packet_buf *p; + struct timeval tv; + + gettimeofday(&tv, NULL); + + p = create_packet(0); + SendToDevice(p->data, p->size); + + while(1) { + static int all_trans = FALSE; + + if (got_new_packet) { + got_new_packet = FALSE; + + if (new_ack && first_packet) { + if (db4) { + printf("* got ACK %d.\n", last_ack_received); + printf("* ACK wanted %d.\n", first_packet->seq); + } + if (last_ack_received == first_packet->seq) { + if (!(p = create_packet(first_packet->seq+1))) { + //break; + } + first_packet = free_packet(first_packet); + } + } + } + + if (new_ack || timeout(&tv, 500)) { + if (p) { + SendToDevice(p->data, p->size); + } + new_ack = FALSE; + gettimeofday(&tv, NULL); + } + + GetNextPacket(); + } +} + +/**************************************************************************** +*# +*# FUNCTION NAME: GetNextPacket +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 961022 ronny Initial version +*# +*#***************************************************************************/ + +void +GetNextPacket(void) +{ + int ret; + + if (db2) printf("> GetNextPacket\n"); + + /* got_new_packet = FALSE;*/ + if ((ret = pcap_dispatch(pd, 1, handler, buf)) == -1) { + pcap_perror(pd, "Error in pcap_dispatch"); + exit(EXIT_FAILURE); + } + + if (db2) printf("< GetNextPacket\n"); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: Handler +*# +*# PARAMETERS: +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 961022 ronny Initial version +*# +*#***************************************************************************/ + +void +Handler(unsigned char *buf, const struct pcap_pkthdr *hdr, + const unsigned char *p) +{ + const unsigned char *src = &p[6]; + const unsigned char *dst = &p[0]; + struct packet_header_T *h = (struct packet_header_T*)p; + + if (db2) printf("> Handler\n"); + got_new_packet = TRUE; + if ((!memcmp(src, eth_addr_local, 6) && !memcmp(dst, dst_addr_of_device, 6)) + || (!memcmp(src, src_addr_of_device, 6) && !memcmp(dst, eth_addr_local, 6))) { + if (db1) printf("#RX######################################################\n"); + if (db1) printf("Length: %u(0x%x)\n", (udword)hdr->len, (udword)hdr->len); + if (pPacket) PrintPacket(p, hdr->caplen, printPacketType); + DecodeSvintoBoot(p); + /* should clean up this... */ + if ((ntohl(h->type) == ACK)) { + if (all_ids || (ntohl(h->id) == id)) { + if (all_ids && one_id_only) { + if (ntohl(h->id) == 0) { + all_ids = FALSE; + id = ntohl(h->id); + printf("Booting device with random id %8.8x.\n", id); + } + } + } + else { + printf("Got ACK from a new id, %8.8lx. Ignoring.\n", + (unsigned long)ntohl(h->id)); + return; + } + new_ack = TRUE; + last_ack_received = ntohl(h->seq); + if (last_ack_received > highest_ack_received) { + highest_ack_received = last_ack_received; + } + } + + if (db1) printf("#########################################################\n"); + + } + if (db2) printf("< Handler\n"); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: ack_on_seq +*# +*# PARAMETERS: +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 980817 ronny Initial version +*# +*#***************************************************************************/ + +struct packet_buf * +packet_with_seq(int seq) +{ + static int last_seq = 0; + struct packet_buf *p = first_packet; + struct packet_header_T *h; + + if (seq < last_seq) { + p = first_packet; + } + + while(p) { + h = (struct packet_header_T*)p->data; + if (ntohl(h->seq) == seq) { + return(p); + } + p = p->next; + } + return(NULL); +} + +struct packet_buf * +ack_on_seq(int seq) +{ + struct packet_buf *p = &first_rec_packet; + struct packet_header_T *h; + + if (db1) printf("***> ack_on_seq: %d.\n", seq); + + while (p) { + /* printf("\nPacket at %x.\n", p);*/ + /* DecodeSvintoBoot(p->data);*/ + h = (struct packet_header_T*)p->data; + if ( (ntohl(h->type) == ACK) && (ntohl(h->seq) == seq) ) { + if (all_ids || ntohl(h->id) == id) { + printf("***< ack_on_seq %d, ok.\n", seq); + return(p); + } + } + p = p->next; + } + if (db1) printf("***< ack_on_seq, no.\n"); + return(NULL); +} + +int +highest_seq_received(void) +{ + struct packet_buf *p = &first_rec_packet; + struct packet_header_T *h; + int highest_seq = -1; + + if (db1) printf("***> highest_seq_received\n"); + + while (p) { + /* printf("\nPacket at %x.\n", p);*/ + /* DecodeSvintoBoot(p->data);*/ + h = (struct packet_header_T*)p->data; + if ((ntohl(h->type) == ACK) && (all_ids || (ntohl(h->id) == id))) { + if ((int)ntohl(h->seq) > highest_seq) { + highest_seq = ntohl(h->seq); + if (db4) printf("Highest seq: %d\n", highest_seq); + } + } + p = p->next; + } + + if (db1) printf("***< highest_seq_received: %d\n", highest_seq); + return(highest_seq); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: PrintPacket +*# +*# PARAMETERS: +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 961022 ronny Initial version +*# +*#***************************************************************************/ + +void +PrintPacket(const unsigned char *p, int size, int type) +{ + int i; + + /* printf("size %d\n", size);*/ + for (i = 0; i != size; i++) { + if (i % p_packet_bpl == 0) + printf("\n%-4.4d: ", i); + if (type == UDEC) + printf("%-3d ", p[i]); + else if (type == HEX) + printf("%-2.2x ", p[i]); + else if (type == CHAR) { + if (isprint(p[i])) + printf("%-3c ", p[i]); + else + printf("%-3d ", p[i]); + } + else if (type == ASCII) { + if (isprint(p[i])) + printf("%c", p[i]); + else + printf("."); + } + } + printf("\n"); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: DecodeSvintoBoot +*# +*# PARAMETERS: +*# +*# DESCRIPTION: Decodes packets that follow the e100boot protocol. +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 961022 ronny Initial version +*# +*#***************************************************************************/ + +void +DecodeSvintoBoot(const unsigned char *p) +{ + char *str; + volatile struct packet_header_T *ph = (struct packet_header_T*)p; + + /* printf("size %d \n", sizeof(struct packet_header_T));*/ + + if (db4) printf("\n>DecodeSvintoBoot. Packet at 0x%x\n", (unsigned int)p); + if (db1) { + printf("%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x -> ", p[6],p[7],p[8],p[9],p[10], p[11]); + printf("%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x\n", p[0],p[1],p[2],p[3],p[4], p[5]); + + printf("length : %4.4lx\n", (long)ntohs(ph->length)); + printf("snap1 : %8.8lx\n", (long)ntohl(ph->snap1)); + printf("snap2 : %8.8lx\n", (long)ntohl(ph->snap2)); + + switch (ntohl(ph->tag)) { + case 0xffffffff: + str = "(host > ETRAX)"; + break; + case 0xfffffffe: + str = "(host < ETRAX)"; + break; + default: + str = "(unknown)"; + break; + } + printf("tag : %8.8lx %s\n", (unsigned long)ntohl(ph->tag), str); + printf("seq : %8.8lx\n", (unsigned long)ntohl(ph->seq)); + } + + switch (ntohl(ph->type)) { + + case STRING: + str = "(STRING)"; + fprintf(stderr, "%s", &p[sizeof(struct packet_header_T)]); + find_string((char*)&p[sizeof(struct packet_header_T)]); + break; + + case NET_INT: { + char search_str[20]; + + str = "(NET_INT)"; + sprintf(search_str, "0x%8.8x", ntohl(*(udword*)&p[sizeof(struct packet_header_T)])); + fprintf(stderr, search_str); + find_string(search_str); + break; + } + + case NET_INT_NL: { + char search_str[20]; + + str = "(NET_INT_NL)"; + sprintf(search_str, "0x%8.8x\n", ntohl(*(udword*)&p[sizeof(struct packet_header_T)])); + fprintf(stderr, search_str); + find_string(search_str); + break; + } + + case ACK: + str = "(ACK)"; + break; + + case BOOT_PACKET: + str = "(bootpacket)"; + break; + + case BOOT_CMDS: + str = "(bootcmds)"; + break; + + default: + str = "(unknown)"; + break; + } + + if (db1) { + printf("(type : %8.8lx %s)\n", (unsigned long)ntohl(ph->type), str); + printf("(id : %8.8lx)\n", (unsigned long)ntohl(ph->id)); + id = ntohl(ph->id); + } +} + +/**************************************************************************** +*# +*# FUNCTION NAME: GetLocalEthAddr +*# +*# PARAMETERS: None. +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 980818 ronny Initial version +*# +*#***************************************************************************/ + +void +GetLocalEthAddr(void) +{ + int fd; + struct ifreq ifr; + + if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { + perror("socket (GetLocalEthAddr)"); + exit(EXIT_FAILURE); + } + + strcpy(ifr.ifr_name, device); + if (ioctl(fd, SIOCGIFHWADDR, &ifr) < 0) { + perror("ioctl"); + exit(EXIT_FAILURE); + } + + memcpy(eth_addr_local, ifr.ifr_hwaddr.sa_data, 6); + if (db1) printf("Ethernet adress for device %s is %2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x\n", + device, + eth_addr_local[0], + eth_addr_local[1], + eth_addr_local[2], + eth_addr_local[3], + eth_addr_local[4], + eth_addr_local[5]); + shutdown(fd, 2); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: SendToDevice +*# +*# PARAMETERS: +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 980818 ronny Initial version +*# +*#***************************************************************************/ + +void +SendToDevice(unsigned char *data, int data_len) +{ + char fName[MAX_STRING_LEN]; + FILE *fd; + struct packet_header_T *h = (struct packet_header_T*) data; + + if (db1) printf("***> SendToDevice\n"); + + if (db2) printf("Sending %d bytes at 0x%x to %s.\n", data_len, (unsigned int)data, device); + if (db1) printf("#TX######################################################\n"); + if (db1) DecodeSvintoBoot(data); + + if (db1) printf("#########################################################\n"); + if (toFiles || cmdsOnly) { + if (cmdsOnly) { /* use a simpler name */ + sprintf(fName, "e100boot.cmds"); + } + else { + sprintf(fName, "e100boot.seq%lu", (unsigned long)ntohl(h->seq)); + } + if (db2) printf("Writing packet to file '%s'.\n", fName); + if ((fd = fopen(fName, "w+")) == NULL) { + printf("Cannot open/create '%s'. %s.\n", fName, strerror(errno)); + exit(EXIT_FAILURE); + } + fwrite(data, data_len, 1, fd); + fclose(fd); + } + else if (sendto(sock_fd, data, data_len, 0, &sock_addr, sizeof(sock_addr)) < 0) { + perror("Sendto failed:"); + exit(EXIT_FAILURE); + } + + if (db1) printf("<*** SendToDevice\n"); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: InitSendSocket +*# +*# PARAMETERS: +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 980818 ronny Initial version +*#***************************************************************************/ + +int +InitSendSocket(char *device_name) +{ + if ((sock_fd = socket(AF_INET, SOCK_PACKET, htons(ETH_P_ALL))) < 0) { + perror("Socket call failed:"); + exit(EXIT_FAILURE); + } + + fcntl(sock_fd, F_SETFL, O_NDELAY); + + sock_addr.sa_family = AF_INET; + strcpy(sock_addr.sa_data, device_name); + + return sock_fd; +} + +/**************************************************************************** +*# +*# FUNCTION NAME: timeout +*# +*# PARAMETERS: +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 980817 ronny Initial version +*# +*#***************************************************************************/ + +int +timeout(struct timeval *tvThen, int ms) +{ + struct timeval tvNow; + struct timeval tvDiff; + + (void) gettimeofday(&tvNow, NULL); + tvDiff = timeval_subtract(&tvNow, tvThen); + if (db4) printf("sec %d.%d\n", (int)tvDiff.tv_sec, (int)tvDiff.tv_usec); + if (ms * 1000 < (tvDiff.tv_sec * 1000000 + tvDiff.tv_usec)) { + if (db4) printf("TIMEOUT\n"); + return(TRUE); + } + + return(FALSE); +} + +/**************************************************************************** + *# + *# FUNCTION NAME: timeval_subtract + *# + *# PARAMETERS: + *# + *# DESCRIPTION: Subtract x-y, and return result. + *# + *# DATE NAME CHANGES + *# ---- ---- ------- + *# 970128 ronny Initial version + *# + *#***************************************************************************/ + +struct timeval +timeval_subtract(struct timeval *x, struct timeval *y) +{ + struct timeval diff; + + diff.tv_sec = x->tv_sec - y->tv_sec; + diff.tv_usec = x->tv_usec - y->tv_usec; + + if (diff.tv_usec < 0) { + diff.tv_sec--; + diff.tv_usec = 1000000 + diff.tv_usec; + } + + return diff; +} diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/network.h b/target/linux/etrax-2.6/image/e100boot/src/sbl/network.h new file mode 100644 index 0000000000..c01a9869b3 --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/network.h @@ -0,0 +1,42 @@ + +extern unsigned char dst_addr_of_device[]; +extern unsigned char src_addr_of_device[]; +extern unsigned char eth_addr_local[]; + +extern int pPacket; + +extern int promisc; + +extern char host1[MAX_STRING_LEN]; +extern char host2[MAX_STRING_LEN]; + +extern int both_addresses; +extern int printPacketType; +extern int p_packet_bpl; + + +#define UDEC 0 +#define CHAR 1 +#define ASCII 2 +#define HEX 3 + +#define SIZE_OF_HEADER (sizeof(struct packet_header_T)) +#define DATA_SIZE 1460 +#define SNAP1 0xaaaa0300 +#define SNAP2 0x408c8856 +#define SERVER_TAG 0xffffffff +#define CLIENT_TAG 0xfffffffe + +#define SIZE_OF_FIRST_HEADER (SIZE_OF_HEADER-8) +#define PACKET_SIZE (DATA_SIZE + SIZE_OF_HEADER) +#define SIZE_OF_BOOT_CMDS ((IO_BUF_END-IO_BUF_START)-CRC_LEN) + +#define BOOT_ADDRESS 0x380000f4 + + +void NetBoot (void); +void SendToDevice (unsigned char *data, int data_len); +void Handler (unsigned char *buf, const struct pcap_pkthdr *hdr, const unsigned char *p); +void GetLocalEthAddr (void); +void net_init (void); +void DecodeSvintoBoot (const unsigned char *p); diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/reg_des.h b/target/linux/etrax-2.6/image/e100boot/src/sbl/reg_des.h new file mode 100644 index 0000000000..dcc0133bc1 --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/reg_des.h @@ -0,0 +1,141 @@ +struct reg_des { + char *name; + unsigned int addr; +} reg_des[] = { + { "R_WAITSTATES", 0xb0000000 }, + { "R_BUS_CONFIG", 0xb0000004 }, + { "R_BUS_STATUS", 0xb0000004 }, + { "R_DRAM_TIMING", 0xb0000008 }, + { "R_SDRAM_TIMING", 0xb0000008 }, + { "R_DRAM_CONFIG", 0xb000000c }, + { "R_SDRAM_CONFIG", 0xb000000c }, + { "R_EXT_DMA_0_CMD", 0xb0000010 }, + { "R_EXT_DMA_0_STAT", 0xb0000010 }, + { "R_EXT_DMA_0_ADDR", 0xb0000014 }, + { "R_EXT_DMA_1_CMD", 0xb0000018 }, + { "R_EXT_DMA_1_STAT", 0xb0000018 }, + { "R_EXT_DMA_1_ADDR", 0xb000001c }, + { "R_TIMER_CTRL", 0xb0000020 }, + { "R_TIMER_DATA", 0xb0000020 }, + { "R_WATCHDOG", 0xb0000024 }, + { "R_SHARED_RAM_CONFIG", 0xb0000040 }, + { "R_SHARED_RAM_ADDR", 0xb0000044 }, + { "R_GEN_CONFIG", 0xb000002c }, + { "R_PORT_G_DATA", 0xb0000028 }, + { "R_PORT_PA_SET", 0xb0000030 }, + { "R_PORT_PA_READ", 0xb0000030 }, + { "R_PORT_PB_SET", 0xb0000038 }, + { "R_PORT_PB_READ", 0xb0000038 }, + { "R_SERIAL0_CTRL", 0xb0000060 }, + { "R_SERIAL0_READ", 0xb0000060 }, + { "R_SERIAL0_XOFF", 0xb0000064 }, + { "R_SERIAL1_CTRL", 0xb0000068 }, + { "R_SERIAL1_READ", 0xb0000068 }, + { "R_SERIAL1_XOFF", 0xb000006c }, + { "R_SERIAL2_CTRL", 0xb0000070 }, + { "R_SERIAL2_READ", 0xb0000070 }, + { "R_SERIAL2_XOFF", 0xb0000074 }, + { "R_SERIAL3_CTRL", 0xb0000078 }, + { "R_SERIAL3_READ", 0xb0000078 }, + { "R_SERIAL3_XOFF", 0xb000007c }, + { "R_NETWORK_SA_0", 0xb0000080 }, + { "R_NETWORK_SA_1", 0xb0000084 }, + { "R_NETWORK_SA_2", 0xb0000088 }, + { "R_NETWORK_GA_0", 0xb000008c }, + { "R_NETWORK_GA_1", 0xb0000090 }, + { "R_NETWORK_REC_CONFIG", 0xb0000094 }, + { "R_NETWORK_GEN_CONFIG", 0xb0000098 }, + { "R_NETWORK_TR_CTRL", 0xb000009c }, + { "R_NETWORK_MGM_CTRL", 0xb00000a0 }, + { "R_NETWORK_STAT", 0xb00000a0 }, + { "R_REC_COUNTERS", 0xb00000a4 }, + { "R_TR_COUNTERS", 0xb00000a8 }, + { "R_PHY_COUNTERS", 0xb00000ac }, + { "R_PAR0_CTRL_DATA", 0xb0000040 }, + { "R_PAR0_STATUS_DATA", 0xb0000040 }, + { "R_PAR0_CONFIG", 0xb0000044 }, + { "R_PAR0_DELAY", 0xb0000048 }, + { "R_PAR1_CTRL_DATA", 0xb0000050 }, + { "R_PAR1_STATUS_DATA", 0xb0000050 }, + { "R_PAR1_CONFIG", 0xb0000054 }, + { "R_PAR1_DELAY", 0xb0000058 }, + { "R_ATA_CTRL_DATA", 0xb0000040 }, + { "R_ATA_STATUS_DATA", 0xb0000040 }, + { "R_ATA_CONFIG", 0xb0000044 }, + { "R_ATA_TRANSFER_CNT", 0xb0000048 }, + { "R_SCSI0_CTRL", 0xb0000044 }, + { "R_SCSI0_CMD_DATA", 0xb0000040 }, + { "R_SCSI0_STATUS", 0xb0000048 }, + { "R_SCSI1_CTRL", 0xb0000054 }, + { "R_SCSI1_CMD_DATA", 0xb0000050 }, + { "R_SCSI1_STATUS", 0xb0000058 }, + { "R_IRQ_MASK0_RD", 0xb00000c0 }, + { "R_IRQ_MASK0_CLR", 0xb00000c0 }, + { "R_IRQ_READ0", 0xb00000c4 }, + { "R_IRQ_MASK0_SET", 0xb00000c4 }, + { "R_IRQ_MASK1_RD", 0xb00000c8 }, + { "R_IRQ_MASK1_CLR", 0xb00000c8 }, + { "R_IRQ_READ1", 0xb00000cc }, + { "R_IRQ_MASK1_SET", 0xb00000cc }, + { "R_IRQ_MASK2_RD", 0xb00000d0 }, + { "R_IRQ_MASK2_CLR", 0xb00000d0 }, + { "R_IRQ_READ2", 0xb00000d4 }, + { "R_IRQ_MASK2_SET", 0xb00000d4 }, + { "R_VECT_MASK_RD", 0xb00000d8 }, + { "R_VECT_MASK_CLR", 0xb00000d8 }, + { "R_VECT_READ", 0xb00000dc }, + { "R_VECT_MASK_SET", 0xb00000dc }, + { "R_SET_EOP", 0xb000003c }, + { "R_DMA_CH0_HWSW", 0xb0000100 }, + { "R_DMA_CH0_DESCR", 0xb000010c }, + { "R_DMA_CH0_NEXT", 0xb0000104 }, + { "R_DMA_CH0_BUF", 0xb0000108 }, + { "R_DMA_CH0_FIRST", 0xb00001a0 }, + { "R_DMA_CH1_HWSW", 0xb0000110 }, + { "R_DMA_CH1_DESCR", 0xb000011c }, + { "R_DMA_CH1_NEXT", 0xb0000114 }, + { "R_DMA_CH1_BUF", 0xb0000118 }, + { "R_DMA_CH1_FIRST", 0xb00001a4 }, + { "R_DMA_CH2_HWSW", 0xb0000120 }, + { "R_DMA_CH2_DESCR", 0xb000012c }, + { "R_DMA_CH2_NEXT", 0xb0000124 }, + { "R_DMA_CH2_BUF", 0xb0000128 }, + { "R_DMA_CH2_FIRST", 0xb00001a8 }, + { "R_DMA_CH3_HWSW", 0xb0000130 }, + { "R_DMA_CH3_DESCR", 0xb000013c }, + { "R_DMA_CH3_NEXT", 0xb0000134 }, + { "R_DMA_CH3_BUF", 0xb0000138 }, + { "R_DMA_CH3_FIRST", 0xb00001ac }, + { "R_DMA_CH4_HWSW", 0xb0000140 }, + { "R_DMA_CH4_DESCR", 0xb000014c }, + { "R_DMA_CH4_NEXT", 0xb0000144 }, + { "R_DMA_CH4_BUF", 0xb0000148 }, + { "R_DMA_CH4_FIRST", 0xb00001b0 }, + { "R_DMA_CH5_HWSW", 0xb0000150 }, + { "R_DMA_CH5_DESCR", 0xb000015c }, + { "R_DMA_CH5_NEXT", 0xb0000154 }, + { "R_DMA_CH5_BUF", 0xb0000158 }, + { "R_DMA_CH5_FIRST", 0xb00001b4 }, + { "R_DMA_CH6_HWSW", 0xb0000160 }, + { "R_DMA_CH6_DESCR", 0xb000016c }, + { "R_DMA_CH6_NEXT", 0xb0000164 }, + { "R_DMA_CH6_BUF", 0xb0000168 }, + { "R_DMA_CH6_FIRST", 0xb00001b8 }, + { "R_DMA_CH7_HWSW", 0xb0000170 }, + { "R_DMA_CH7_DESCR", 0xb000017c }, + { "R_DMA_CH7_NEXT", 0xb0000174 }, + { "R_DMA_CH7_BUF", 0xb0000178 }, + { "R_DMA_CH7_FIRST", 0xb00001bc }, + { "R_DMA_CH8_HWSW", 0xb0000180 }, + { "R_DMA_CH8_DESCR", 0xb000018c }, + { "R_DMA_CH8_NEXT", 0xb0000184 }, + { "R_DMA_CH8_BUF", 0xb0000188 }, + { "R_DMA_CH8_FIRST", 0xb00001c0 }, + { "R_DMA_CH9_HWSW", 0xb0000190 }, + { "R_DMA_CH9_DESCR", 0xb000019c }, + { "R_DMA_CH9_NEXT", 0xb0000194 }, + { "R_DMA_CH9_BUF", 0xb0000198 }, + { "R_DMA_CH9_FIRST", 0xb00001c4 }, + { "R_TEST_MODE", 0xb00000fc }, + { NULL, 0 } +}; diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/ser_ima.c b/target/linux/etrax-2.6/image/e100boot/src/sbl/ser_ima.c new file mode 100644 index 0000000000..2aa50d2422 --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/ser_ima.c @@ -0,0 +1,825 @@ + +/* cconv 1.2 12/16/97, Copyright (C) 1997, Axis Communications AB */ + +const char ser_ima[] = +{ + '\x0f', '\x05', '\x0f', '\x05', '\x6f', '\xee', '\x00', '\x1f', + '\x00', '\x38', '\x3f', '\x0d', '\x08', '\x01', '\x00', '\x38', + '\x78', '\x56', '\x34', '\x12', '\x21', '\x43', '\x65', '\x87', + '\x6f', '\xde', '\x20', '\x00', '\x00', '\xb0', '\x5f', '\x9c', + '\x65', '\x6f', '\xed', '\x9b', '\x5f', '\x9c', '\x25', '\x2f', + '\x7f', '\x0d', '\x6c', '\x16', '\x00', '\x38', '\xe9', '\x9b', + '\xed', '\x9b', '\x3f', '\x0d', '\x28', '\x01', '\x00', '\x38', + '\xfc', '\xe1', '\x7e', '\xbe', '\x7e', '\x92', '\x7f', '\x0d', + '\x31', '\x00', '\x00', '\xb0', '\xc9', '\x9b', '\x7f', '\x0d', + '\x30', '\x00', '\x00', '\xb0', '\x70', '\x0a', '\x7f', '\x92', + '\x7f', '\x0d', '\x6c', '\x16', '\x00', '\x38', '\xc9', '\x9b', + '\x7f', '\x0d', '\x39', '\x00', '\x00', '\xb0', '\xc9', '\x9b', + '\x7f', '\x0d', '\x38', '\x00', '\x00', '\xb0', '\xc9', '\x9b', + '\x7f', '\x0d', '\x0e', '\x1b', '\x00', '\x38', '\x70', '\x8a', + '\x6f', '\x9e', '\x20', '\x00', '\x00', '\xb0', '\x69', '\x9a', + '\x79', '\x67', '\x7f', '\x0d', '\xc2', '\x1a', '\x00', '\x38', + '\xe9', '\x9b', '\x6f', '\x9e', '\x22', '\x00', '\x00', '\xb0', + '\x59', '\x9a', '\x59', '\x94', '\x7f', '\x0d', '\x2a', '\x1b', + '\x00', '\x38', '\xe9', '\x9b', '\x6f', '\x9e', '\x04', '\x00', + '\x00', '\xb0', '\x69', '\x9a', '\x06', '\x93', '\xe1', '\x93', + '\x81', '\x92', '\x7f', '\x0d', '\x12', '\x1b', '\x00', '\x38', + '\xc9', '\x9b', '\x7f', '\x0d', '\xd4', '\x1a', '\x00', '\x38', + '\x70', '\x4a', '\x3f', '\xbd', '\x68', '\x02', '\x00', '\x38', + '\x3f', '\xbd', '\xec', '\x02', '\x00', '\x38', '\x3f', '\xbd', + '\x0c', '\x02', '\x00', '\x38', '\x6a', '\xa6', '\xf7', '\x30', + '\x0f', '\x05', '\x6f', '\x9e', '\x00', '\x01', '\x00', '\x38', + '\x69', '\x9a', '\x7f', '\x0d', '\x0e', '\x1b', '\x00', '\x38', + '\xe9', '\x9a', '\x24', '\x80', '\x0f', '\x05', '\x6f', '\x9e', + '\x12', '\x1b', '\x00', '\x38', '\x49', '\x9a', '\xcf', '\x9e', + '\x01', '\x00', '\xd3', '\x20', '\x0f', '\x05', '\x6f', '\xde', + '\xd4', '\x01', '\x00', '\xb0', '\x4d', '\x9a', '\x38', '\x93', + '\x41', '\x93', '\xcd', '\x9b', '\xc1', '\xe0', '\x0f', '\x05', + '\x4f', '\x9e', '\x55', '\x00', '\x7f', '\x0d', '\x6c', '\x16', + '\x00', '\x38', '\xc9', '\x9b', '\x7f', '\x0d', '\x30', '\x00', + '\x00', '\xb0', '\xc9', '\x9b', '\x3e', '\xbe', '\x3f', '\x0d', + '\xac', '\x03', '\x00', '\x38', '\xfc', '\xe1', '\x7e', '\xbe', + '\x3f', '\xbd', '\xa8', '\x02', '\x00', '\x38', '\x6a', '\xa6', + '\x16', '\x20', '\x41', '\x92', '\x3f', '\xbd', '\x34', '\x02', + '\x00', '\x38', '\x6a', '\xa6', '\x0a', '\x30', '\x79', '\x86', + '\x3f', '\xbd', '\xec', '\x02', '\x00', '\x38', '\x79', '\x86', + '\x69', '\xa6', '\x3e', '\x0d', '\x84', '\xe2', '\x6f', '\x9e', + '\x22', '\x00', '\x00', '\xb0', '\x59', '\x9a', '\x59', '\x94', + '\xee', '\x9b', '\x6f', '\xce', '\x2a', '\x1b', '\x00', '\x38', + '\x6c', '\x9a', '\x6e', '\xda', '\xad', '\x96', '\xb9', '\x96', + '\xdf', '\x9c', '\x80', '\x25', '\x0a', '\xd0', '\x0f', '\x05', + '\x6e', '\x9a', '\xec', '\x9b', '\x04', '\xe0', '\x41', '\xa2', + '\x7a', '\x86', '\x7f', '\xb6', '\x04', '\xe2', '\x00', '\x00', + '\x6f', '\x9e', '\x6c', '\x16', '\x00', '\x38', '\x79', '\x8a', + '\x7f', '\x0d', '\x64', '\x00', '\x00', '\xb0', '\x70', '\x8a', + '\x4f', '\xde', '\x55', '\x00', '\x7f', '\x0d', '\x63', '\x00', + '\x00', '\xb0', '\xcd', '\xdb', '\x0b', '\xd2', '\x7f', '\x0d', + '\x62', '\x00', '\x00', '\xb0', '\xcd', '\xdb', '\xa0', '\xd2', + '\xc9', '\xdb', '\x7f', '\x0d', '\x61', '\x00', '\x00', '\xb0', + '\xcd', '\xdb', '\x41', '\x92', '\x7f', '\x0d', '\x14', '\x1b', + '\x00', '\x38', '\xc9', '\x9b', '\x7f', '\xb6', '\x0f', '\x05', + '\x6f', '\x9e', '\x60', '\x00', '\x00', '\xb0', '\x69', '\x9a', + '\x59', '\xb4', '\x1f', '\xbf', '\xff', '\x01', '\x88', '\x93', + '\x2e', '\xa0', '\x0f', '\x05', '\x6f', '\xce', '\x0e', '\x1b', + '\x00', '\x38', '\x6c', '\x9a', '\x6f', '\xde', '\x04', '\x01', + '\x00', '\x38', '\x6d', '\x99', '\xcb', '\xbb', '\x01', '\x92', + '\xec', '\x9b', '\x6f', '\x9e', '\x22', '\x00', '\x00', '\xb0', + '\x49', '\x9a', '\x49', '\x94', '\x7f', '\x0d', '\x2a', '\x1b', + '\x00', '\x38', '\xe9', '\x9b', '\x7f', '\xb6', '\x41', '\xa2', + '\x7f', '\xb6', '\x7a', '\x86', '\x6f', '\x9e', '\x61', '\x00', + '\x00', '\xb0', '\x49', '\x9a', '\x85', '\x93', '\xf5', '\xa0', + '\x0f', '\x05', '\x4f', '\x9e', '\x2b', '\x00', '\x7f', '\x0d', + '\x6c', '\x16', '\x00', '\x38', '\xc9', '\x9b', '\x7f', '\x0d', + '\x60', '\x00', '\x00', '\xb0', '\xc9', '\x9b', '\x7f', '\xb6', + '\x0f', '\x05', '\x8a', '\x0b', '\x28', '\x30', '\x0f', '\x05', + '\x6f', '\x9e', '\x61', '\x00', '\x00', '\xb0', '\x49', '\x9a', + '\x85', '\x93', '\x14', '\xa0', '\x0f', '\x05', '\x6f', '\x9e', + '\x6c', '\x16', '\x00', '\x38', '\x4a', '\xde', '\xc9', '\xdb', + '\x7f', '\x0d', '\x60', '\x00', '\x00', '\xb0', '\xcd', '\xdb', + '\x8a', '\x0b', '\xdd', '\x20', '\x0f', '\x05', '\x7f', '\xb6', + '\x0f', '\x05', '\xfc', '\xe1', '\x7e', '\xbe', '\x8e', '\xe2', + '\x4f', '\x9e', '\x30', '\x00', '\x01', '\xe1', '\xc9', '\x9b', + '\x4f', '\xde', '\x78', '\x00', '\x02', '\xe1', '\xcd', '\xdb', + '\x4d', '\x92', '\x0b', '\xe1', '\xc9', '\x9b', '\x4a', '\xd2', + '\x0c', '\xe1', '\xcd', '\xdb', '\x0d', '\xe1', '\x70', '\x0a', + '\x4b', '\xb6', '\x06', '\x20', '\x7c', '\x86', '\x0b', '\xe1', + '\x70', '\x0a', '\x6c', '\x96', '\xc2', '\x93', '\x6a', '\xb6', + '\xe9', '\xb7', '\x4b', '\xd6', '\x0f', '\xd3', '\xcf', '\xde', + '\x09', '\x00', '\x04', '\x80', '\x49', '\x92', '\x07', '\xd2', + '\xac', '\x96', '\x4e', '\xb2', '\x2e', '\xb6', '\x2b', '\x96', + '\x30', '\xd2', '\xf3', '\x91', '\xcd', '\xdb', '\x01', '\xc2', + '\xc8', '\xc2', '\xd9', '\x20', '\x6c', '\x96', '\x6e', '\xa6', + '\x01', '\xa2', '\x3f', '\xbd', '\x12', '\x03', '\x00', '\x38', + '\x0e', '\xe2', '\x3e', '\x0d', '\xfc', '\xe1', '\x7e', '\xbe', + '\x84', '\xe2', '\xfe', '\x0b', '\x4f', '\x9e', '\xaa', '\xff', + '\x7f', '\x0d', '\x6c', '\x16', '\x00', '\x38', '\xc9', '\x9b', + '\x7f', '\x0d', '\x30', '\x00', '\x00', '\xb0', '\xc9', '\x9b', + '\x6f', '\x0e', '\x12', '\x03', '\x00', '\x38', '\x6f', '\xae', + '\x70', '\x16', '\x00', '\x38', '\xb0', '\xb9', '\x6f', '\xae', + '\xc2', '\x1a', '\x00', '\x38', '\x6a', '\xaa', '\x7a', '\x67', + '\x41', '\xb2', '\x3f', '\xbd', '\x42', '\x03', '\x00', '\x38', + '\x6f', '\xae', '\x3c', '\x1a', '\x00', '\x38', '\xb0', '\xb9', + '\x6f', '\x9e', '\xf0', '\x00', '\x00', '\x38', '\xef', '\x9e', + '\x82', '\x1a', '\x00', '\x38', '\x0e', '\x30', '\x70', '\x86', + '\x09', '\x0c', '\xef', '\x9e', '\x82', '\x1a', '\x00', '\x38', + '\xf7', '\x20', '\x0f', '\x05', '\x6f', '\xae', '\x82', '\x16', + '\x00', '\x38', '\x3f', '\xbd', '\x12', '\x03', '\x00', '\x38', + '\x60', '\xa6', '\x41', '\xb2', '\x3f', '\xbd', '\x42', '\x03', + '\x00', '\x38', '\x3f', '\xbd', '\x74', '\x04', '\x00', '\x38', + '\x3f', '\x0d', '\x28', '\x01', '\x00', '\x38', '\xbe', '\x0f', + '\x3e', '\x0d', '\x84', '\xe2', '\x4f', '\x9e', '\x55', '\x00', + '\x7f', '\x0d', '\x6c', '\x16', '\x00', '\x38', '\xc9', '\x9b', + '\x7f', '\x0d', '\x30', '\x00', '\x00', '\xb0', '\xc9', '\x9b', + '\x6f', '\x9e', '\x30', '\x00', '\x00', '\xb0', '\x69', '\xda', + '\x7d', '\x87', '\x7f', '\x0d', '\x6c', '\x16', '\x00', '\x38', + '\xcd', '\xdb', '\xc9', '\xdb', '\x7e', '\x8a', '\x6e', '\x9a', + '\xef', '\x9e', '\x80', '\x84', '\x1e', '\x00', '\xe1', '\x30', + '\x0f', '\x05', '\x6e', '\x9a', '\x01', '\x92', '\xee', '\x9b', + '\xed', '\xe0', '\x0f', '\x05', '\xfc', '\xe1', '\x7e', '\xbe', + '\x84', '\xe2', '\xfe', '\x0b', '\x6f', '\x0e', '\x12', '\x03', + '\x00', '\x38', '\x6f', '\xae', '\x9e', '\x16', '\x00', '\x38', + '\xb0', '\xb9', '\x3f', '\xbd', '\xec', '\x02', '\x00', '\x38', + '\x6f', '\xae', '\x00', '\x1f', '\x00', '\x38', '\x5f', '\xbc', + '\xec', '\x01', '\x3f', '\xbd', '\xf2', '\x07', '\x00', '\x38', + '\x6f', '\xae', '\xb8', '\x16', '\x00', '\x38', '\xb0', '\xb9', + '\x3f', '\xbd', '\xb8', '\x04', '\x00', '\x38', '\xbe', '\x0f', + '\x3e', '\xbe', '\x3f', '\x0d', '\x32', '\x04', '\x00', '\x38', + '\xfc', '\xe1', '\x7e', '\xbe', '\x98', '\xe2', '\xfe', '\x4b', + '\x6f', '\xde', '\x00', '\x1f', '\x00', '\x38', '\x6d', '\x9a', + '\x79', '\x67', '\xed', '\x9f', '\xef', '\xde', '\xec', '\x20', + '\x00', '\x38', '\xf3', '\x20', '\x0f', '\x05', '\x6f', '\x3e', + '\x00', '\x1f', '\x00', '\x38', '\xa3', '\x0b', '\xff', '\x3d', + '\xfe', '\x02', '\x0f', '\x05', '\x63', '\x9a', '\x81', '\x92', + '\xcf', '\x9d', '\x0b', '\x00', '\x5f', '\x95', '\x3f', '\xf8', + '\x54', '\x02', '\x22', '\x01', '\x18', '\x00', '\x62', '\x00', + '\x90', '\x00', '\x96', '\x01', '\xc8', '\x01', '\xe4', '\x00', + '\x00', '\x02', '\xb8', '\x00', '\x9a', '\x02', '\xce', '\x02', + '\x6f', '\xae', '\xca', '\x16', '\x00', '\x38', '\x3f', '\xbd', + '\x12', '\x03', '\x00', '\x38', '\x6f', '\x0e', '\x42', '\x03', + '\x00', '\x38', '\x04', '\x31', '\x62', '\xae', '\x41', '\xb2', + '\xb0', '\xb9', '\x08', '\x31', '\x61', '\xae', '\x41', '\xb2', + '\xb0', '\xb9', '\x6f', '\x0e', '\x16', '\x1b', '\x00', '\x38', + '\x60', '\x9a', '\x81', '\x92', '\xe0', '\x9b', '\x3f', '\xbd', + '\xec', '\x02', '\x00', '\x38', '\x60', '\x9a', '\x01', '\x92', + '\xe0', '\x9b', '\x62', '\xaa', '\x61', '\xba', '\x3f', '\xbd', + '\xf2', '\x07', '\x00', '\x38', '\xff', '\xed', '\x88', '\x02', + '\x0c', '\x32', '\x6f', '\xae', '\xd8', '\x16', '\x00', '\x38', + '\x3f', '\xbd', '\x12', '\x03', '\x00', '\x38', '\x6f', '\x0e', + '\x42', '\x03', '\x00', '\x38', '\x04', '\x31', '\x62', '\xae', + '\x41', '\xb2', '\xb0', '\xb9', '\x08', '\x31', '\x61', '\xae', + '\x41', '\xb2', '\xb0', '\xb9', '\x61', '\x1a', '\x72', '\x09', + '\xe1', '\x1b', '\xff', '\xed', '\x5a', '\x02', '\x0c', '\x32', + '\x6f', '\xae', '\xe8', '\x16', '\x00', '\x38', '\x3f', '\xbd', + '\x12', '\x03', '\x00', '\x38', '\x6f', '\x1e', '\x42', '\x03', + '\x00', '\x38', '\x04', '\x31', '\x60', '\xae', '\x41', '\xb2', + '\xb1', '\xb9', '\x60', '\xaa', '\x6a', '\xaa', '\x41', '\xb2', + '\xb1', '\xb9', '\xff', '\xed', '\x32', '\x02', '\x08', '\x32', + '\x6f', '\xae', '\xf8', '\x16', '\x00', '\x38', '\x3f', '\xbd', + '\x12', '\x03', '\x00', '\x38', '\x04', '\x31', '\x60', '\xae', + '\x41', '\xb2', '\x3f', '\xbd', '\x42', '\x03', '\x00', '\x38', + '\x60', '\xaa', '\xff', '\x3d', '\xc0', '\x01', '\x0f', '\x05', + '\x81', '\xa2', '\xfd', '\x20', '\x0f', '\x05', '\xff', '\xed', + '\x06', '\x02', '\x08', '\x32', '\x6f', '\x4e', '\x12', '\x03', + '\x00', '\x38', '\x6f', '\xae', '\x06', '\x17', '\x00', '\x38', + '\xb4', '\xb9', '\x6f', '\x0e', '\x42', '\x03', '\x00', '\x38', + '\x04', '\x31', '\x62', '\xae', '\x41', '\xb2', '\xb0', '\xb9', + '\x08', '\x31', '\x61', '\xae', '\x41', '\xb2', '\xb0', '\xb9', + '\x62', '\x2a', '\x62', '\x2a', '\xe1', '\x2a', '\xff', '\x3d', + '\xb8', '\x01', '\x0f', '\x05', '\x6f', '\xae', '\x14', '\x17', + '\x00', '\x38', '\xb4', '\xb9', '\xff', '\xed', '\xd0', '\x01', + '\x0f', '\x05', '\x6f', '\x4e', '\x12', '\x03', '\x00', '\x38', + '\x6f', '\xae', '\x24', '\x17', '\x00', '\x38', '\xb4', '\xb9', + '\x6f', '\x2e', '\x42', '\x03', '\x00', '\x38', '\x04', '\x31', + '\x61', '\xae', '\x41', '\xb2', '\xb2', '\xb9', '\x08', '\x31', + '\x60', '\xae', '\x41', '\xb2', '\xb2', '\xb9', '\x61', '\xaa', + '\x60', '\xba', '\x6e', '\xc6', '\x14', '\xc2', '\x3f', '\xbd', + '\xf0', '\x08', '\x00', '\x38', '\x6a', '\xa6', '\x30', '\x20', + '\x0f', '\x05', '\x6f', '\xae', '\x30', '\x17', '\x00', '\x38', + '\xb4', '\xb9', '\x14', '\xe1', '\x6a', '\xaa', '\x41', '\xb2', + '\xb2', '\xb9', '\x14', '\xe1', '\x6a', '\xaa', '\x6a', '\xb6', + '\x0f', '\xbc', '\x40', '\x00', '\x8f', '\xac', '\x40', '\x00', + '\x3c', '\xa3', '\x3c', '\xb3', '\x3f', '\xbd', '\x98', '\x09', + '\x00', '\x38', '\xff', '\xed', '\x6a', '\x01', '\x0f', '\x05', + '\x6f', '\xae', '\x4c', '\x17', '\x00', '\x38', '\xb4', '\xb9', + '\xff', '\xed', '\x54', '\x01', '\x0c', '\x32', '\x6f', '\xae', + '\x62', '\x17', '\x00', '\x38', '\x3f', '\xbd', '\x12', '\x03', + '\x00', '\x38', '\x6f', '\x0e', '\x42', '\x03', '\x00', '\x38', + '\x04', '\x31', '\x62', '\xae', '\x41', '\xb2', '\xb0', '\xb9', + '\x08', '\x31', '\x61', '\xae', '\x41', '\xb2', '\xb0', '\xb9', + '\x62', '\xaa', '\x61', '\xba', '\x3f', '\xbd', '\x98', '\x09', + '\x00', '\x38', '\xff', '\xed', '\x22', '\x01', '\x0c', '\x32', + '\x6f', '\xae', '\x6e', '\x17', '\x00', '\x38', '\x3f', '\xbd', + '\x12', '\x03', '\x00', '\x38', '\x6f', '\x0e', '\x42', '\x03', + '\x00', '\x38', '\x04', '\x31', '\x62', '\xae', '\x41', '\xb2', + '\xb0', '\xb9', '\x08', '\x31', '\x61', '\xae', '\x41', '\xb2', + '\xb0', '\xb9', '\x62', '\xaa', '\xe1', '\xaa', '\xda', '\x90', + '\x0f', '\x05', '\x7a', '\x0e', '\x08', '\x31', '\xea', '\xaa', + '\xf9', '\x80', '\x0f', '\x05', '\xea', '\xe0', '\x0c', '\x32', + '\x6f', '\xae', '\x7a', '\x17', '\x00', '\x38', '\x3f', '\xbd', + '\x12', '\x03', '\x00', '\x38', '\x6f', '\x0e', '\x42', '\x03', + '\x00', '\x38', '\x04', '\x31', '\x61', '\xae', '\x41', '\xb2', + '\xb0', '\xb9', '\x08', '\x31', '\x64', '\xae', '\x41', '\xb2', + '\xb0', '\xb9', '\x0c', '\x31', '\x62', '\xae', '\x41', '\xb2', + '\xb0', '\xb9', '\x6f', '\x0e', '\x36', '\x13', '\x00', '\x38', + '\x61', '\xaa', '\x64', '\xba', '\x62', '\xca', '\xb0', '\xb9', + '\x6a', '\xa6', '\xac', '\x30', '\x10', '\x32', '\xc3', '\xa2', + '\xae', '\x20', '\x7a', '\x86', '\x62', '\xca', '\xef', '\xcd', + '\x00', '\x00', '\x01', '\x00', '\x64', '\xba', '\xb0', '\xb9', + '\x9e', '\xe0', '\x0f', '\x05', '\x6f', '\xde', '\xa0', '\x1a', + '\x00', '\x38', '\x6d', '\x9a', '\x7f', '\x0d', '\xc0', '\x01', + '\x00', '\xb0', '\xe9', '\x9b', '\x04', '\xd1', '\x59', '\x98', + '\x7f', '\x0d', '\xc4', '\x01', '\x00', '\xb0', '\xe9', '\x9b', + '\x6f', '\x1e', '\x12', '\x03', '\x00', '\x38', '\x6f', '\xae', + '\x82', '\x17', '\x00', '\x38', '\xb1', '\xb9', '\x04', '\x31', + '\x60', '\xae', '\x41', '\xb2', '\x3f', '\xbd', '\x42', '\x03', + '\x00', '\x38', '\x6f', '\xae', '\x8a', '\x17', '\x00', '\x38', + '\xb1', '\xb9', '\x60', '\x9a', '\xb9', '\x09', '\x50', '\xe0', + '\x08', '\x32', '\x6f', '\xae', '\xfe', '\x16', '\x00', '\x38', + '\x3f', '\xbd', '\x12', '\x03', '\x00', '\x38', '\x6f', '\x0e', + '\x42', '\x03', '\x00', '\x38', '\x04', '\x31', '\x61', '\xae', + '\x41', '\xb2', '\xb0', '\xb9', '\x08', '\x31', '\x62', '\xae', + '\x41', '\xb2', '\xb0', '\xb9', '\x61', '\x1a', '\x61', '\x9a', + '\x08', '\x30', '\x81', '\x92', '\xe1', '\x9b', '\x20', '\xe0', + '\x62', '\x3a', '\x1c', '\xe0', '\x0c', '\x32', '\x6f', '\xae', + '\x90', '\x17', '\x00', '\x38', '\x3f', '\xbd', '\x12', '\x03', + '\x00', '\x38', '\x63', '\xaa', '\x41', '\xb2', '\x3f', '\xbd', + '\x42', '\x03', '\x00', '\x38', '\x0a', '\xe0', '\x0f', '\x05', + '\xa3', '\x0b', '\xff', '\x2d', '\x06', '\xfd', '\x0f', '\x05', + '\x6f', '\xae', '\x8a', '\x17', '\x00', '\x38', '\x3f', '\xbd', + '\x12', '\x03', '\x00', '\x38', '\xbe', '\x4f', '\x04', '\xe2', + '\x3e', '\x0d', '\xfc', '\xe1', '\x7e', '\xbe', '\x8c', '\xe2', + '\xfe', '\x2b', '\x6a', '\x26', '\x6b', '\x06', '\x7f', '\x0d', + '\x0e', '\x1b', '\x00', '\x38', '\x70', '\x8a', '\x7f', '\x0d', + '\x04', '\x01', '\x00', '\x38', '\xea', '\xab', '\x6f', '\x9e', + '\x12', '\x1b', '\x00', '\x38', '\x49', '\x9a', '\xcf', '\x9e', + '\x01', '\x00', '\x86', '\x20', '\x0f', '\x05', '\x6f', '\xde', + '\xc6', '\x1a', '\x00', '\x38', '\x08', '\xd1', '\xea', '\xab', + '\x7f', '\x0d', '\x00', '\x01', '\x00', '\x38', '\xeb', '\xbb', + '\x6b', '\x96', '\x04', '\x92', '\xdf', '\x9d', '\xdc', '\x05', + '\xdd', '\x9b', '\x6f', '\x9e', '\xa4', '\x01', '\x00', '\xb0', + '\x69', '\xda', '\x6f', '\xde', '\x90', '\x1a', '\x00', '\x38', + '\xe9', '\xdb', '\x6f', '\xde', '\xd4', '\x01', '\x00', '\xb0', + '\x4d', '\x9a', '\x38', '\x93', '\x44', '\x93', '\xcd', '\x9b', + '\x6f', '\xde', '\xd4', '\x01', '\x00', '\xb0', '\x4d', '\x9a', + '\x07', '\x93', '\xcf', '\x9e', '\x04', '\x00', '\xf7', '\x30', + '\x0f', '\x05', '\x4d', '\x9a', '\x38', '\x93', '\x41', '\x93', + '\xcd', '\x9b', '\x3f', '\xbd', '\x0c', '\x02', '\x00', '\x38', + '\x6a', '\xa6', '\xf7', '\x30', '\x0f', '\x05', '\x6f', '\xce', + '\x0e', '\x1b', '\x00', '\x38', '\xec', '\x0a', '\x10', '\x80', + '\x0f', '\x05', '\x6f', '\xde', '\xd4', '\x01', '\x00', '\xb0', + '\x4d', '\x9a', '\x38', '\x93', '\x41', '\x93', '\xcd', '\x9b', + '\xec', '\x0a', '\xd7', '\x90', '\x71', '\x86', '\x22', '\xe0', + '\x62', '\x96', '\x7f', '\x0d', '\x0e', '\x1b', '\x00', '\x38', + '\xeb', '\xba', '\x14', '\x80', '\x71', '\x86', '\x3f', '\xbd', + '\x0c', '\x02', '\x00', '\x38', '\x7f', '\x0d', '\x0e', '\x1b', + '\x00', '\x38', '\xe0', '\x0a', '\xf1', '\x90', '\x71', '\x86', + '\x62', '\x96', '\x20', '\x96', '\xe9', '\x26', '\x0e', '\x30', + '\x62', '\xd6', '\x0d', '\x1c', '\x62', '\x96', '\x20', '\x96', + '\xe9', '\xd6', '\xf7', '\x20', '\x0f', '\x05', '\x6f', '\xae', + '\xa4', '\x17', '\x00', '\x38', '\x3f', '\xbd', '\x12', '\x03', + '\x00', '\x38', '\x61', '\xa6', '\x41', '\xb2', '\xbe', '\x2f', + '\x3e', '\xbe', '\x3f', '\x0d', '\x42', '\x03', '\x00', '\x38', + '\xfc', '\xe1', '\x7e', '\xbe', '\x8c', '\xe2', '\xfe', '\x2b', + '\x6b', '\x06', '\x6c', '\x26', '\xeb', '\xa6', '\x40', '\x00', + '\x6a', '\xc6', '\xe0', '\xc6', '\x32', '\x00', '\x71', '\x86', + '\x6c', '\xb6', '\x6c', '\x96', '\x79', '\x87', '\x61', '\xd6', + '\xc3', '\xd3', '\xed', '\x97', '\x49', '\xd6', '\xcb', '\x9b', + '\x4b', '\x9a', '\xcd', '\x96', '\x0c', '\x30', '\x7d', '\x87', + '\x6f', '\xae', '\xba', '\x17', '\x00', '\x38', '\x40', '\xe0', + '\xe2', '\xbb', '\xcb', '\xdf', '\x01', '\x12', '\xc4', '\x12', + '\x06', '\x30', '\xe0', '\xb6', '\xd7', '\x10', '\x6c', '\x96', + '\x04', '\xc2', '\xe0', '\xc6', '\xc5', '\x10', '\x0f', '\x05', + '\xe0', '\xa6', '\x4e', '\x00', '\x6a', '\xc6', '\xe0', '\xc6', + '\x40', '\x00', '\x71', '\x86', '\x6c', '\xa6', '\x61', '\x96', + '\xc3', '\x93', '\x6c', '\xd6', '\xe9', '\xd7', '\x4a', '\x9a', + '\xcd', '\x96', '\x22', '\x30', '\x01', '\x12', '\x81', '\x12', + '\xe2', '\xab', '\x6f', '\xae', '\xd8', '\x17', '\x00', '\x38', + '\x3f', '\xbd', '\x12', '\x03', '\x00', '\x38', '\x62', '\xaa', + '\x41', '\xb2', '\x3f', '\xbd', '\x42', '\x03', '\x00', '\x38', + '\x7a', '\x86', '\xbe', '\x2f', '\x3e', '\x0d', '\xc4', '\x12', + '\x08', '\x30', '\x01', '\xa2', '\xe0', '\xa6', '\xc9', '\x10', + '\x61', '\x96', '\x04', '\xc2', '\xe0', '\xc6', '\xb7', '\x10', + '\x0f', '\x05', '\x41', '\xa2', '\xbe', '\x2f', '\x3e', '\x0d', + '\xfc', '\xe1', '\x7e', '\xbe', '\x94', '\xe2', '\xfe', '\x4b', + '\x6b', '\x26', '\xeb', '\xa6', '\x5a', '\x90', '\x6a', '\x06', + '\x60', '\xa6', '\x7b', '\x86', '\x3f', '\xbd', '\x42', '\x03', + '\x00', '\x38', '\x6f', '\xae', '\xf6', '\x17', '\x00', '\x38', + '\x3f', '\xbd', '\x12', '\x03', '\x00', '\x38', '\xe2', '\x06', + '\x2a', '\x90', '\x74', '\x86', '\x60', '\x16', '\x60', '\x36', + '\x6f', '\xae', '\x4c', '\x18', '\x00', '\x38', '\x3f', '\xbd', + '\x12', '\x03', '\x00', '\x38', '\x63', '\xae', '\x7b', '\x86', + '\x3f', '\xbd', '\x42', '\x03', '\x00', '\x38', '\x01', '\x42', + '\xc4', '\x42', '\x08', '\x30', '\x04', '\x12', '\xe2', '\x16', + '\xdf', '\x80', '\x0f', '\x05', '\x6f', '\xae', '\xb4', '\x16', + '\x00', '\x38', '\x3f', '\xbd', '\x12', '\x03', '\x00', '\x38', + '\x10', '\x02', '\xe2', '\x06', '\xad', '\x80', '\x60', '\xa6', + '\xbe', '\x4f', '\x3e', '\x0d', '\x05', '\xa1', '\x49', '\x98', + '\xc2', '\x92', '\x0a', '\x30', '\xc4', '\x92', '\x0e', '\x30', + '\x0f', '\x05', '\x7f', '\xb6', '\x7a', '\x86', '\x6a', '\xb9', + '\x5a', '\xa8', '\x7f', '\xb6', '\x0f', '\x05', '\x6a', '\xb9', + '\x6a', '\xaa', '\x7f', '\xb6', '\x0f', '\x05', '\x6a', '\xd6', + '\x05', '\xa1', '\x4a', '\xaa', '\x4a', '\x94', '\xc2', '\x92', + '\x0a', '\x30', '\xc4', '\x92', '\x10', '\x30', '\x0f', '\x05', + '\x7f', '\xb6', '\x7a', '\x86', '\x5c', '\xca', '\x6d', '\xb9', + '\xdc', '\xcb', '\x7f', '\xb6', '\x4a', '\xa4', '\x6c', '\xca', + '\x6d', '\xb9', '\xec', '\xcb', '\x4a', '\xa4', '\x7f', '\xb6', + '\x0f', '\x05', '\xfc', '\xe1', '\x7e', '\xbe', '\x84', '\xe2', + '\xee', '\xbb', '\x04', '\xa1', '\x49', '\x9a', '\xcf', '\x9e', + '\x01', '\x00', '\x06', '\x20', '\x0f', '\x05', '\x24', '\xe0', + '\xc1', '\xc3', '\xcf', '\x9e', '\x02', '\x00', '\x0c', '\x20', + '\x6b', '\x96', '\xd0', '\x93', '\x69', '\xb7', '\xee', '\xbb', + '\x12', '\xe0', '\xc2', '\xc3', '\x6f', '\xae', '\x22', '\x18', + '\x00', '\x38', '\x3f', '\xbd', '\x12', '\x03', '\x00', '\x38', + '\x0c', '\xe0', '\x0f', '\x05', '\x6c', '\xb6', '\x6e', '\xc6', + '\x3f', '\xbd', '\x26', '\x0a', '\x00', '\x38', '\x04', '\xe2', + '\x3e', '\x0d', '\xfc', '\xe1', '\x7e', '\xbe', '\x84', '\xe2', + '\xfe', '\x0b', '\x6a', '\x06', '\x4f', '\xbc', '\xaa', '\x00', + '\x5f', '\xcc', '\x55', '\x05', '\x3f', '\xbd', '\x52', '\x0a', + '\x00', '\x38', '\x60', '\xa6', '\x4f', '\xbc', '\x55', '\x00', + '\x5f', '\xcc', '\xaa', '\x02', '\xbe', '\x0f', '\x3e', '\xbe', + '\x3f', '\x0d', '\x52', '\x0a', '\x00', '\x38', '\xfc', '\xe1', + '\x7e', '\xbe', '\x90', '\xe2', '\xfe', '\x3b', '\x6a', '\x26', + '\x04', '\xa1', '\x49', '\x9a', '\xcf', '\x9e', '\x02', '\x00', + '\x42', '\x20', '\x6b', '\x36', '\x6f', '\x0e', '\x04', '\x0a', + '\x00', '\x38', '\xb0', '\xb9', '\x6a', '\x16', '\x62', '\xa6', + '\x63', '\xb6', '\xb0', '\xb9', '\x61', '\xd6', '\xf0', '\xd3', + '\x1f', '\xdf', '\x40', '\x00', '\x6a', '\x96', '\xf0', '\x93', + '\x1f', '\x9f', '\x40', '\x00', '\xe9', '\xd6', '\x14', '\x20', + '\x7c', '\x86', '\x2f', '\x1f', '\x40', '\x00', '\x00', '\x00', + '\x2f', '\xaf', '\x40', '\x00', '\x00', '\x00', '\xea', '\x16', + '\x04', '\x30', '\x0f', '\x05', '\x41', '\xc2', '\x6c', '\xa6', + '\xbe', '\x3f', '\x3e', '\x0d', '\x6f', '\x1e', '\x04', '\x0a', + '\x00', '\x38', '\xb1', '\xb9', '\x4a', '\x04', '\x0f', '\x0f', + '\x40', '\x00', '\x62', '\xa6', '\x63', '\xb6', '\xb1', '\xb9', + '\x2f', '\xaf', '\x40', '\x00', '\x00', '\x00', '\xea', '\x06', + '\x3a', '\x25', '\xbe', '\x3f', '\x3e', '\x0d', '\xfc', '\xe1', + '\x7e', '\xbe', '\xa8', '\xe2', '\xfe', '\x8b', '\x6a', '\x36', + '\x04', '\xa1', '\x44', '\x9e', '\xcf', '\x9e', '\x02', '\x00', + '\x04', '\x20', '\x41', '\x72', '\x42', '\x72', '\x6f', '\x2e', + '\x52', '\x0a', '\x00', '\x38', '\x4f', '\xbc', '\x98', '\x00', + '\x4f', '\xcc', '\x55', '\x00', '\xb2', '\xb9', '\x50', '\xb2', + '\xe7', '\xb4', '\x6f', '\x1e', '\x04', '\x0a', '\x00', '\x38', + '\x63', '\xa6', '\xb1', '\xb9', '\xcf', '\xae', '\x51', '\x00', + '\xff', '\x2d', '\x9c', '\x01', '\x63', '\xa6', '\x51', '\xb2', + '\xe7', '\xb4', '\xb1', '\xb9', '\xcf', '\xae', '\x52', '\x00', + '\xff', '\x2d', '\x8c', '\x01', '\x63', '\xa6', '\x52', '\xb2', + '\xe7', '\xb4', '\xb1', '\xb9', '\xcf', '\xae', '\x59', '\x00', + '\xff', '\x2d', '\x7c', '\x01', '\x63', '\xa6', '\x24', '\xe1', + '\x70', '\x8a', '\x6f', '\xae', '\x3c', '\x18', '\x00', '\x38', + '\x3f', '\xbd', '\x12', '\x03', '\x00', '\x38', '\x63', '\xaa', + '\x41', '\xb2', '\x3f', '\xbd', '\x42', '\x03', '\x00', '\x38', + '\x4f', '\xbc', '\x27', '\x00', '\xe7', '\xb4', '\x63', '\xa6', + '\xb1', '\xb9', '\x41', '\x92', '\xea', '\x94', '\x06', '\x32', + '\xe3', '\x9b', '\x86', '\x32', '\x4f', '\xbc', '\x2c', '\x00', + '\xe7', '\xb4', '\x63', '\xa6', '\xb1', '\xb9', '\x6a', '\x86', + '\x55', '\xb2', '\xe7', '\xb4', '\x63', '\xa6', '\xb1', '\xb9', + '\x6a', '\x06', '\x6a', '\xb6', '\x04', '\xb2', '\xe7', '\xb4', + '\x63', '\xa6', '\xb1', '\xb9', '\xcf', '\xae', '\x30', '\x00', + '\x3e', '\x20', '\x63', '\xa6', '\x4f', '\xbc', '\xf0', '\x00', + '\x5f', '\xcc', '\x55', '\x05', '\xb2', '\xb9', '\x63', '\xa6', + '\x3f', '\xbd', '\x9a', '\x0a', '\x00', '\x38', '\x63', '\xa6', + '\x4f', '\xbc', '\x90', '\x00', '\x5f', '\xcc', '\x55', '\x05', + '\xb2', '\xb9', '\x44', '\xb8', '\x2b', '\xb6', '\x63', '\xa6', + '\xb1', '\xb9', '\x4a', '\x54', '\x0f', '\x5f', '\x80', '\xff', + '\x63', '\xa6', '\x4f', '\xbc', '\x98', '\x00', '\x4f', '\xcc', + '\x55', '\x00', '\xb2', '\xb9', '\x10', '\xe0', '\x0f', '\x05', + '\x0f', '\x02', '\xe7', '\x04', '\x60', '\xb6', '\xb1', '\xb9', + '\xcf', '\xae', '\x03', '\x00', '\x35', '\x35', '\x0a', '\x31', + '\xd8', '\x8b', '\xc8', '\x82', '\x12', '\xd0', '\x68', '\x46', + '\x6f', '\xae', '\x4e', '\x18', '\x00', '\x38', '\x3f', '\xbd', + '\x12', '\x03', '\x00', '\x38', '\xd2', '\xe0', '\x7a', '\x86', + '\x65', '\x56', '\x94', '\x20', '\x81', '\x42', '\x90', '\xe0', + '\x74', '\x86', '\xc2', '\x03', '\x60', '\xb6', '\x2f', '\xb2', + '\xe7', '\xb4', '\x6f', '\x1e', '\x04', '\x0a', '\x00', '\x38', + '\x63', '\xa6', '\xb1', '\xb9', '\x6a', '\x66', '\x60', '\xb6', + '\x30', '\xb2', '\xe7', '\xb4', '\x63', '\xa6', '\xb1', '\xb9', + '\xc8', '\xa3', '\x6a', '\x67', '\xc8', '\x63', '\x60', '\xb6', + '\x2d', '\xb2', '\xe7', '\xb4', '\x63', '\xa6', '\xb1', '\xb9', + '\x6a', '\x26', '\x2e', '\x02', '\xe7', '\x04', '\x63', '\xa6', + '\x60', '\xb6', '\xb1', '\xb9', '\xc8', '\xa3', '\x6a', '\x27', + '\x65', '\x56', '\x0a', '\x30', '\x01', '\x22', '\x68', '\x96', + '\xa4', '\x96', '\x04', '\xe0', '\x81', '\x92', '\x64', '\x96', + '\x19', '\x95', '\x63', '\xd6', '\x2d', '\x95', '\x6d', '\x96', + '\x24', '\xe1', '\x6d', '\xda', '\x0c', '\x91', '\xed', '\xdb', + '\x10', '\x91', '\xe6', '\x6b', '\x14', '\x91', '\xe2', '\x2b', + '\x62', '\x26', '\x10', '\xd0', '\x0f', '\x05', '\x24', '\xe1', + '\x29', '\x6a', '\x24', '\xe1', '\xe9', '\x9b', '\x81', '\x22', + '\xf5', '\x20', '\x0f', '\x05', '\x24', '\xe1', '\x6d', '\xda', + '\x06', '\x31', '\xed', '\xda', '\x1e', '\x30', '\x65', '\x56', + '\x06', '\x30', '\x01', '\x42', '\x81', '\x42', '\x81', '\x42', + '\x65', '\x56', '\x0c', '\x30', '\xe8', '\x46', '\x64', '\x46', + '\x69', '\xa0', '\x64', '\x06', '\x08', '\xe0', '\x63', '\xa6', + '\x61', '\xb0', '\x64', '\x06', '\x63', '\xa6', '\x4f', '\xbc', + '\xf0', '\x00', '\x5f', '\xcc', '\x55', '\x05', '\x3f', '\xbd', + '\x52', '\x0a', '\x00', '\x38', '\x12', '\xe0', '\x41', '\xa2', + '\x4f', '\xbc', '\xf0', '\x00', '\x5f', '\xcc', '\x55', '\x05', + '\x3f', '\xbd', '\x52', '\x0a', '\x00', '\x38', '\x7a', '\x86', + '\xbe', '\x8f', '\x04', '\xe2', '\x3e', '\x0d', '\xfc', '\xe1', + '\x7e', '\xbe', '\x90', '\xe2', '\xfe', '\x3b', '\x06', '\xa1', + '\xa0', '\x0b', '\xff', '\x2d', '\x16', '\x04', '\x6a', '\x26', + '\x3f', '\xbd', '\x3e', '\x0b', '\x00', '\x38', '\x6a', '\xa6', + '\xff', '\x2d', '\x86', '\x03', '\x41', '\xa2', '\x62', '\xa6', + '\x3f', '\xbd', '\x9a', '\x0a', '\x00', '\x38', '\x62', '\xa6', + '\x4f', '\xbc', '\x90', '\x00', '\x5f', '\xcc', '\x55', '\x05', + '\x3f', '\xbd', '\x52', '\x0a', '\x00', '\x38', '\x6f', '\x1e', + '\x04', '\x0a', '\x00', '\x38', '\x62', '\xa6', '\x7b', '\x86', + '\xb1', '\xb9', '\x6a', '\x36', '\x04', '\x21', '\x40', '\xbe', + '\x4b', '\xb4', '\x2b', '\xb6', '\x62', '\xa6', '\xb1', '\xb9', + '\x42', '\x92', '\xc0', '\x9a', '\x1c', '\x20', '\x63', '\xc6', + '\xf0', '\xc3', '\x53', '\x94', '\xe9', '\xc6', '\x14', '\x20', + '\x63', '\x06', '\x6a', '\xd6', '\xf0', '\xd3', '\x5a', '\x94', + '\xe9', '\xd6', '\x0a', '\x20', '\xd0', '\x03', '\x6c', '\x36', + '\x6d', '\xa6', '\x63', '\x06', '\xd0', '\x03', '\x6a', '\x07', + '\x62', '\xa6', '\x4f', '\xbc', '\xf0', '\x00', '\x5f', '\xcc', + '\x55', '\x05', '\x3f', '\xbd', '\x52', '\x0a', '\x00', '\x38', + '\xef', '\x0e', '\xc0', '\x00', '\x1f', '\x00', '\xff', '\x3d', + '\x48', '\x02', '\x0f', '\x05', '\x60', '\x90', '\x0f', '\x05', + '\xef', '\x0e', '\xc4', '\x22', '\x01', '\x00', '\xb0', '\x30', + '\x0f', '\x05', '\x20', '\x90', '\x0f', '\x05', '\xef', '\x0e', + '\x58', '\x22', '\x01', '\x00', '\xff', '\x3d', '\x5a', '\x01', + '\x0f', '\x05', '\xef', '\x0e', '\x5b', '\x22', '\x01', '\x00', + '\xff', '\x3d', '\x4e', '\x01', '\x0f', '\x05', '\xff', '\xed', + '\xb6', '\x02', '\x0f', '\x05', '\xef', '\x0e', '\xda', '\x22', + '\x01', '\x00', '\xff', '\x3d', '\x9c', '\x01', '\x0f', '\x05', + '\x14', '\x90', '\x0f', '\x05', '\xef', '\x0e', '\xd6', '\x22', + '\x01', '\x00', '\xff', '\x3d', '\x8c', '\x01', '\x0f', '\x05', + '\xff', '\xed', '\x94', '\x02', '\x0f', '\x05', '\xef', '\x0e', + '\x49', '\x22', '\x04', '\x00', '\xc4', '\x30', '\x0f', '\x05', + '\xff', '\xed', '\x84', '\x02', '\x0f', '\x05', '\xef', '\x0e', + '\xd7', '\x00', '\x20', '\x00', '\xff', '\x3d', '\x6a', '\x01', + '\x0f', '\x05', '\x20', '\x90', '\x0f', '\x05', '\xef', '\x0e', + '\xc2', '\x00', '\x1f', '\x00', '\xff', '\x3d', '\x00', '\x02', + '\x0f', '\x05', '\xef', '\x0e', '\xc9', '\x00', '\x1f', '\x00', + '\xff', '\x3d', '\x18', '\x02', '\x0f', '\x05', '\xff', '\xed', + '\x56', '\x02', '\x0f', '\x05', '\xef', '\x0e', '\x4f', '\x00', + '\x98', '\x00', '\xff', '\x3d', '\x3c', '\x01', '\x0f', '\x05', + '\x12', '\x90', '\x0f', '\x05', '\xef', '\x0e', '\x43', '\x00', + '\x98', '\x00', '\x76', '\x30', '\x0f', '\x05', '\xff', '\xed', + '\x36', '\x02', '\x0f', '\x05', '\xef', '\x0e', '\xc2', '\x00', + '\x98', '\x00', '\xff', '\x2d', '\x2a', '\x02', '\x0f', '\x05', + '\x6f', '\x1e', '\x32', '\x19', '\x00', '\x38', '\x61', '\x1a', + '\x6f', '\xde', '\x00', '\x00', '\x20', '\x00', '\x06', '\x21', + '\xed', '\xdb', '\x0c', '\x21', '\x70', '\x8a', '\x6f', '\x9e', + '\x00', '\x00', '\x01', '\x00', '\x10', '\x21', '\xe9', '\x9b', + '\x5f', '\xd2', '\x14', '\x21', '\xed', '\xdb', '\x6f', '\x9e', + '\x00', '\x00', '\x1f', '\x00', '\x18', '\x21', '\xe9', '\x9b', + '\x1f', '\xdc', '\xe1', '\x7f', '\x1c', '\x21', '\xed', '\xdb', + '\x41', '\x92', '\x20', '\x21', '\xe9', '\x9b', '\x6f', '\xde', + '\x00', '\x80', '\x1f', '\x00', '\x24', '\x21', '\xed', '\xdb', + '\x5f', '\xdc', '\x00', '\x20', '\x28', '\x21', '\xed', '\xdb', + '\x42', '\xd2', '\x2c', '\x21', '\xed', '\xdb', '\x6f', '\xde', + '\x00', '\xc0', '\x1f', '\x00', '\xff', '\xed', '\x16', '\x01', + '\x0f', '\x05', '\x6f', '\x1e', '\x2e', '\x19', '\x00', '\x38', + '\x61', '\x1a', '\x6f', '\x9e', '\x00', '\x00', '\x20', '\x00', + '\x06', '\x21', '\xe9', '\x9b', '\x0c', '\x21', '\x70', '\x8a', + '\x5f', '\x9c', '\x00', '\x40', '\x10', '\x21', '\xe9', '\x9b', + '\x41', '\xd2', '\x14', '\x21', '\xed', '\xdb', '\x18', '\x21', + '\xe9', '\x9b', '\x5f', '\x9c', '\x00', '\x20', '\x1c', '\x21', + '\xe9', '\x9b', '\x42', '\x92', '\x20', '\x21', '\xe9', '\x9b', + '\x1f', '\x9c', '\xfe', '\x7f', '\x24', '\x21', '\xe9', '\x9b', + '\x28', '\x21', '\xe9', '\x9b', '\x2c', '\x21', '\xed', '\xdb', + '\x6f', '\x9e', '\x00', '\x00', '\x01', '\x00', '\x30', '\x21', + '\xe9', '\x9b', '\x34', '\x21', '\xe9', '\x9b', '\x58', '\xe0', + '\x5f', '\xd2', '\x6f', '\x1e', '\x26', '\x19', '\x00', '\x38', + '\x61', '\x1a', '\x6f', '\x9e', '\x00', '\x00', '\x10', '\x00', + '\x06', '\x21', '\xe9', '\x9b', '\x0c', '\x21', '\x70', '\x8a', + '\x5f', '\x9c', '\x00', '\x40', '\x10', '\x21', '\xe9', '\x9b', + '\x41', '\xd2', '\x14', '\x21', '\xed', '\xdb', '\x18', '\x21', + '\xe9', '\x9b', '\x5f', '\x9c', '\x00', '\x20', '\x1c', '\x21', + '\xe9', '\x9b', '\x42', '\x92', '\x20', '\x21', '\xe9', '\x9b', + '\x1f', '\x9c', '\xfe', '\x7f', '\x24', '\x21', '\xe9', '\x9b', + '\x28', '\x21', '\xe9', '\x9b', '\x2c', '\x21', '\xed', '\xdb', + '\x6f', '\x9e', '\x00', '\x00', '\x01', '\x00', '\x30', '\x21', + '\xe9', '\x9b', '\x34', '\x21', '\xe9', '\x9b', '\x4f', '\xd2', + '\x38', '\x21', '\xed', '\xdb', '\xff', '\xed', '\x3e', '\x01', + '\x0f', '\x05', '\x6f', '\x1e', '\x2a', '\x19', '\x00', '\x38', + '\x61', '\x1a', '\x6f', '\x9e', '\x00', '\x00', '\x10', '\x00', + '\x06', '\x21', '\xe9', '\x9b', '\x0c', '\x21', '\x70', '\x8a', + '\x6f', '\xde', '\x00', '\x00', '\x01', '\x00', '\x10', '\x21', + '\xed', '\xdb', '\x4f', '\x92', '\x14', '\x21', '\xe9', '\x9b', + '\x6f', '\xde', '\x00', '\x00', '\x0f', '\x00', '\x18', '\x21', + '\xed', '\xdb', '\x1f', '\x9c', '\xf1', '\x7f', '\x1c', '\x21', + '\xe9', '\x9b', '\x41', '\x92', '\x20', '\x21', '\xe9', '\x9b', + '\x6f', '\xde', '\x00', '\x80', '\x0f', '\x00', '\x24', '\x21', + '\xed', '\xdb', '\x5f', '\xdc', '\x00', '\x20', '\x28', '\x21', + '\xed', '\xdb', '\x42', '\xd2', '\x2c', '\x21', '\xed', '\xdb', + '\x6f', '\xde', '\x00', '\xc0', '\x0f', '\x00', '\x30', '\x21', + '\xed', '\xdb', '\x5f', '\xdc', '\x00', '\x40', '\x34', '\x21', + '\xed', '\xdb', '\x38', '\x21', '\xe9', '\x9b', '\xce', '\xe0', + '\x0f', '\x05', '\x6f', '\x1e', '\x2e', '\x19', '\x00', '\x38', + '\x61', '\x1a', '\x6f', '\x9e', '\x00', '\x00', '\x20', '\x00', + '\x06', '\x21', '\xe9', '\x9b', '\x0c', '\x21', '\x70', '\x8a', + '\x5f', '\xdc', '\x00', '\x20', '\x10', '\x21', '\xed', '\xdb', + '\x48', '\x92', '\x14', '\x21', '\xe9', '\x9b', '\x6f', '\x9e', + '\x00', '\x00', '\x01', '\x00', '\x18', '\x21', '\xe9', '\x9b', + '\x1c', '\x21', '\xe9', '\x9b', '\x62', '\xe0', '\x5f', '\xd2', + '\x6f', '\x1e', '\x32', '\x19', '\x00', '\x38', '\x61', '\x1a', + '\x6f', '\x9e', '\x00', '\x00', '\x20', '\x00', '\x06', '\x21', + '\xe9', '\x9b', '\x0c', '\x21', '\x70', '\x8a', '\x6f', '\xde', + '\x00', '\x00', '\x01', '\x00', '\x10', '\x21', '\xed', '\xdb', + '\x26', '\xe0', '\x5f', '\x92', '\x6f', '\x1e', '\x36', '\x19', + '\x00', '\x38', '\x61', '\x1a', '\x6f', '\x9e', '\x00', '\x00', + '\x40', '\x00', '\x06', '\x21', '\xe9', '\x9b', '\x0c', '\x21', + '\x70', '\x8a', '\x6f', '\xde', '\x00', '\x00', '\x01', '\x00', + '\x10', '\x21', '\xed', '\xdb', '\x4f', '\x9c', '\x3f', '\x00', + '\x14', '\x21', '\xe9', '\x9b', '\x6f', '\xde', '\x00', '\x00', + '\x1f', '\x00', '\x18', '\x21', '\xed', '\xdb', '\x5f', '\x9c', + '\x00', '\x20', '\x1c', '\x21', '\xe9', '\x9b', '\x48', '\xd2', + '\x20', '\x21', '\xed', '\xdb', '\x30', '\xe0', '\x0f', '\x05', + '\x04', '\x21', '\x49', '\x9a', '\x6f', '\xae', '\x6a', '\x18', + '\x00', '\x38', '\xcf', '\x9e', '\x01', '\x00', '\x08', '\x30', + '\x0f', '\x05', '\x6f', '\xae', '\x7c', '\x18', '\x00', '\x38', + '\x3f', '\xbd', '\x12', '\x03', '\x00', '\x38', '\x62', '\xaa', + '\x41', '\xb2', '\x3f', '\xbd', '\x42', '\x03', '\x00', '\x38', + '\x7a', '\x86', '\xbe', '\x3f', '\x3e', '\x0d', '\x6f', '\x3e', + '\x12', '\x03', '\x00', '\x38', '\x6f', '\xae', '\x94', '\x18', + '\x00', '\x38', '\xb3', '\xb9', '\x04', '\x21', '\x40', '\x9e', + '\xcf', '\x9e', '\x01', '\x00', '\x0c', '\x20', '\x42', '\xd2', + '\x6f', '\xae', '\x9c', '\x18', '\x00', '\x38', '\xb3', '\xb9', + '\x42', '\xd2', '\xc0', '\xda', '\x32', '\x20', '\x47', '\xc2', + '\x06', '\x21', '\x6d', '\x9e', '\xc1', '\x93', '\xed', '\x9b', + '\x62', '\xd6', '\x0c', '\xd1', '\x69', '\x9a', '\xc1', '\x93', + '\x0c', '\xd1', '\xe9', '\x9b', '\x10', '\xd1', '\x69', '\x9a', + '\xc1', '\x93', '\x10', '\xd1', '\xe9', '\x9b', '\x81', '\xc2', + '\xe9', '\x60', '\x0c', '\xd2', '\x6f', '\xae', '\x9e', '\x18', + '\x00', '\x38', '\x3f', '\xbd', '\x12', '\x03', '\x00', '\x38', + '\x6f', '\x0e', '\x12', '\x03', '\x00', '\x38', '\x6f', '\xae', + '\xa0', '\x18', '\x00', '\x38', '\xb0', '\xb9', '\x61', '\xa6', + '\xb0', '\xb9', '\x6f', '\xae', '\xd2', '\x17', '\x00', '\x38', + '\xb0', '\xb9', '\x62', '\xaa', '\x41', '\xb2', '\x3f', '\xbd', + '\x42', '\x03', '\x00', '\x38', '\x41', '\xa2', '\xbe', '\x3f', + '\x3e', '\x0d', '\xfc', '\xe1', '\x7e', '\xbe', '\x8c', '\xe2', + '\xfe', '\x2b', '\x6a', '\x16', '\x6b', '\x26', '\x6f', '\x0e', + '\x9a', '\x0a', '\x00', '\x38', '\xb0', '\xb9', '\x61', '\xa6', + '\x4f', '\xbc', '\x80', '\x00', '\x5f', '\xcc', '\x55', '\x05', + '\x3f', '\xbd', '\x52', '\x0a', '\x00', '\x38', '\x61', '\xa6', + '\xb0', '\xb9', '\x04', '\x11', '\x49', '\x9a', '\xcf', '\x9e', + '\x02', '\x00', '\x10', '\x20', '\x0f', '\x05', '\x6f', '\x9e', + '\x30', '\x00', '\x30', '\x00', '\x61', '\x29', '\xe9', '\x9b', + '\xbe', '\x2f', '\x3e', '\x0d', '\x4f', '\x9c', '\x30', '\x00', + '\x61', '\x29', '\xd9', '\x9b', '\xbe', '\x2f', '\x3e', '\x0d', + '\x84', '\xe2', '\xfe', '\x0b', '\x06', '\xa1', '\xeb', '\xba', + '\x10', '\x10', '\x0f', '\x05', '\x7a', '\x86', '\x7f', '\xb6', + '\xbe', '\x0f', '\x10', '\xa1', '\x6a', '\xaa', '\x7f', '\xb6', + '\xbe', '\x0f', '\x70', '\x86', '\x0c', '\xa1', '\xeb', '\xba', + '\x22', '\x10', '\x7d', '\x86', '\x14', '\xa1', '\xed', '\xda', + '\x10', '\x00', '\x79', '\x86', '\x10', '\xa1', '\x6c', '\xca', + '\x01', '\x92', '\x14', '\xa1', '\xe9', '\x9a', '\xf9', '\x10', + '\x2c', '\xd6', '\x0c', '\xa1', '\x29', '\xda', '\xe9', '\xb6', + '\xd1', '\x10', '\x0f', '\x05', '\x01', '\x02', '\xc7', '\x02', + '\xd3', '\x80', '\x0c', '\xa2', '\x7a', '\x86', '\x7f', '\xb6', + '\xbe', '\x0f', '\x84', '\xe2', '\xfe', '\x0b', '\x6a', '\x06', + '\x6b', '\xa6', '\x6d', '\xb6', '\x7d', '\x86', '\xeb', '\xd6', + '\x48', '\xa0', '\x0f', '\x05', '\x60', '\x9a', '\x2d', '\x96', + '\x49', '\xa5', '\x59', '\x9a', '\x4c', '\xd5', '\xd9', '\x9a', + '\x32', '\x30', '\x02', '\xd2', '\x82', '\xd2', '\x6b', '\x96', + '\x2a', '\x96', '\xe9', '\xa6', '\x20', '\x00', '\x6a', '\xc6', + '\x60', '\xc9', '\x59', '\x9a', '\xdf', '\x9e', '\xff', '\xff', + '\x0a', '\x30', '\x02', '\xc2', '\x82', '\xc2', '\x42', '\xa2', + '\x7f', '\xb6', '\xbe', '\x0f', '\x6b', '\x96', '\x2a', '\x96', + '\xe9', '\xc6', '\xe5', '\x10', '\x0f', '\x05', '\x41', '\xa2', + '\x7f', '\xb6', '\xbe', '\x0f', '\xeb', '\xd6', '\xbd', '\xb0', + '\x0f', '\x05', '\x7a', '\x86', '\x7f', '\xb6', '\xbe', '\x0f', + '\xfc', '\xe1', '\x7e', '\xbe', '\x90', '\xe2', '\xfe', '\x3b', + '\x73', '\x86', '\x72', '\x86', '\x6f', '\x0e', '\x3a', '\x19', + '\x00', '\x38', '\x41', '\x12', '\x04', '\x01', '\xc1', '\x1b', + '\xcf', '\x1e', '\x01', '\x00', '\x04', '\x30', '\x42', '\x92', + '\x44', '\x92', '\x05', '\x01', '\xc9', '\x9b', '\x60', '\xa6', + '\x3f', '\xbd', '\x2e', '\x0d', '\x00', '\x38', '\x6a', '\xa6', + '\x0c', '\x20', '\x0f', '\x05', '\xc1', '\x13', '\xcf', '\x1e', + '\x03', '\x00', '\xd9', '\x80', '\x0f', '\x05', '\x06', '\x01', + '\x23', '\x3a', '\x0f', '\x0c', '\x6c', '\x00', '\x01', '\x22', + '\xc1', '\x22', '\xc7', '\x80', '\x63', '\xa6', '\xbe', '\x3f', + '\x3e', '\x0d', '\xfc', '\xe1', '\x7e', '\xbe', '\x98', '\xe2', + '\xfe', '\x5b', '\x6a', '\x16', '\x6b', '\x56', '\x6c', '\x36', + '\x70', '\x86', '\xed', '\x06', '\x74', '\xa0', '\x6d', '\x46', + '\x05', '\x11', '\x49', '\x9a', '\xcf', '\x9e', '\x02', '\x00', + '\x12', '\x20', '\x0f', '\x05', '\x43', '\x05', '\x59', '\x9a', + '\xdf', '\x9e', '\xff', '\xff', '\x54', '\x30', '\x42', '\x22', + '\x05', '\x11', '\x49', '\x9a', '\xcf', '\x9e', '\x04', '\x00', + '\x0e', '\x20', '\x61', '\xa6', '\x43', '\x05', '\x69', '\x9a', + '\xff', '\x92', '\x3e', '\x30', '\x44', '\x22', '\x61', '\xa6', + '\x3f', '\xbd', '\x9a', '\x0a', '\x00', '\x38', '\x61', '\xa6', + '\x4f', '\xbc', '\xa0', '\x00', '\x5f', '\xcc', '\x55', '\x05', + '\x3f', '\xbd', '\x52', '\x0a', '\x00', '\x38', '\x65', '\xb6', + '\x20', '\xb6', '\x63', '\xc6', '\x20', '\xc6', '\x61', '\xa6', + '\x3f', '\xbd', '\x26', '\x0a', '\x00', '\x38', '\x6a', '\x26', + '\x61', '\xa6', '\x65', '\xb6', '\x20', '\xb6', '\x3f', '\xbd', + '\xc6', '\x0a', '\x00', '\x38', '\x6a', '\xa6', '\xf3', '\x20', + '\x61', '\xa6', '\x22', '\x06', '\xe4', '\x06', '\x91', '\xb0', + '\x0f', '\x05', '\xbe', '\x5f', '\x3e', '\x0d', '\xfc', '\xe1', + '\x7e', '\xbe', '\xa4', '\xe2', '\xfe', '\x8b', '\x6a', '\x16', + '\x6b', '\x06', '\x6c', '\x86', '\x3f', '\xbd', '\x58', '\x12', + '\x00', '\x38', '\x6a', '\x96', '\x1a', '\x30', '\x41', '\xa2', + '\x60', '\xd6', '\x28', '\xd6', '\xe9', '\xd6', '\x14', '\x80', + '\x0f', '\x05', '\x6f', '\xae', '\xa4', '\x18', '\x00', '\x38', + '\x3f', '\xbd', '\x12', '\x03', '\x00', '\x38', '\x42', '\xa2', + '\xbe', '\x8f', '\x3e', '\x0d', '\x6f', '\xce', '\x40', '\x19', + '\x00', '\x38', '\x6c', '\xca', '\xec', '\x06', '\x1e', '\x10', + '\xec', '\xd6', '\x6f', '\x9e', '\x12', '\x1a', '\x00', '\x38', + '\x09', '\x91', '\x70', '\x8a', '\x16', '\x91', '\xe1', '\x1b', + '\xac', '\x06', '\x1a', '\x91', '\xe0', '\x0b', '\x1e', '\x91', + '\xe8', '\x8b', '\x74', '\xe0', '\x0f', '\x05', '\x5a', '\x80', + '\x6c', '\x96', '\x6f', '\xde', '\x12', '\x1a', '\x00', '\x38', + '\x01', '\xd1', '\xe1', '\x1b', '\x05', '\xd1', '\xe0', '\x0b', + '\xa0', '\x96', '\x09', '\xd1', '\xe9', '\x9b', '\x29', '\x16', + '\x16', '\xd1', '\xe1', '\x1b', '\x1a', '\xd1', '\x70', '\x8a', + '\x68', '\xc6', '\xa9', '\xc6', '\x1e', '\xd1', '\xec', '\xcb', + '\x46', '\xe0', '\x0f', '\x05', '\x6f', '\xae', '\xc0', '\x18', + '\x00', '\x38', '\x3f', '\xbd', '\x12', '\x03', '\x00', '\x38', + '\x44', '\xa2', '\xbe', '\x8f', '\x3e', '\x0d', '\x6f', '\xae', + '\xd4', '\x18', '\x00', '\x38', '\x3f', '\xbd', '\x12', '\x03', + '\x00', '\x38', '\x60', '\xa6', '\x41', '\xb2', '\x3f', '\xbd', + '\x42', '\x03', '\x00', '\x38', '\x43', '\xa2', '\xbe', '\x8f', + '\x3e', '\x0d', '\x6f', '\x9e', '\x12', '\x1a', '\x00', '\x38', + '\x01', '\x91', '\xe1', '\x1b', '\x05', '\x91', '\xe0', '\x0b', + '\x09', '\x91', '\xe8', '\x8b', '\x1e', '\x91', '\x70', '\x8a', + '\x6f', '\xce', '\x12', '\x1a', '\x00', '\x38', '\x7c', '\x0a', + '\x0d', '\xc1', '\x70', '\x8a', '\x11', '\xc1', '\x70', '\x8a', + '\x15', '\xc1', '\x79', '\x0e', '\x7f', '\x0d', '\x34', '\x1a', + '\x00', '\x38', '\x70', '\x8a', '\x7f', '\x0d', '\x38', '\x1a', + '\x00', '\x38', '\x70', '\x8a', '\x0d', '\x91', '\xe8', '\x8a', + '\xff', '\x8d', '\xc0', '\x01', '\x75', '\x86', '\x65', '\x56', + '\x04', '\x20', '\x6c', '\xd6', '\x15', '\xd2', '\x65', '\x96', + '\x29', '\x55', '\x65', '\x36', '\x23', '\x95', '\x09', '\xd1', + '\x69', '\x9a', '\x24', '\x30', '\x2c', '\x36', '\x0d', '\xd1', + '\xe9', '\x9a', '\x1c', '\x80', '\x0f', '\x05', '\x09', '\x31', + '\x69', '\x9a', '\x10', '\x30', '\x0f', '\x05', '\x83', '\x0b', + '\x0a', '\x20', '\x0f', '\x05', '\x0d', '\x31', '\xe9', '\x9a', + '\x06', '\x20', '\x0f', '\x05', '\x65', '\x56', '\x35', '\x35', + '\x11', '\x31', '\x63', '\x3a', '\xca', '\x32', '\x4d', '\x90', + '\x65', '\x96', '\x29', '\x55', '\x65', '\x36', '\x23', '\x95', + '\x2f', '\x3e', '\x12', '\x1a', '\x00', '\x38', '\x05', '\x31', + '\x64', '\x4a', '\x0d', '\x31', '\x69', '\x9a', '\x29', '\x46', + '\x01', '\x31', '\x27', '\x9a', '\x65', '\xa6', '\xc3', '\xa3', + '\xa5', '\xa6', '\xc2', '\xa3', '\xa5', '\xa6', '\xc2', '\xa3', + '\x2f', '\xae', '\x3a', '\x19', '\x00', '\x38', '\x64', '\xb6', + '\x3f', '\xbd', '\xa8', '\x11', '\x00', '\x38', '\x83', '\x0b', + '\x24', '\x30', '\x6a', '\x66', '\x65', '\xa6', '\xc3', '\xa3', + '\xa5', '\xa6', '\xc2', '\xa3', '\xa5', '\xa6', '\xc2', '\xa3', + '\x2f', '\xae', '\x3a', '\x19', '\x00', '\x38', '\x64', '\xb6', + '\x3f', '\xbd', '\xc6', '\x0a', '\x00', '\x38', '\x6a', '\xa6', + '\xe5', '\x20', '\x65', '\xa6', '\x73', '\x0a', '\x65', '\x26', + '\xc3', '\x23', '\xa5', '\x26', '\xc2', '\x23', '\xa5', '\x26', + '\xc2', '\x23', '\x2f', '\x2e', '\x3a', '\x19', '\x00', '\x38', + '\x62', '\xa6', '\x4f', '\xbc', '\xf0', '\x00', '\x5f', '\xcc', + '\x55', '\x05', '\x3f', '\xbd', '\x52', '\x0a', '\x00', '\x38', + '\x62', '\xa6', '\x64', '\xb6', '\x67', '\xc6', '\x66', '\xd6', + '\x3f', '\xbd', '\xfa', '\x11', '\x00', '\x38', '\x4a', '\xa6', + '\x28', '\x20', '\x7b', '\x86', '\x0d', '\x31', '\x69', '\xde', + '\x26', '\xd6', '\xe9', '\xdb', '\x11', '\x31', '\x70', '\x8a', + '\x62', '\xaa', '\x24', '\xa6', '\x3f', '\xbd', '\x42', '\x03', + '\x00', '\x38', '\x6f', '\xae', '\xde', '\x18', '\x00', '\x38', + '\x3f', '\xbd', '\x12', '\x03', '\x00', '\x38', '\xaa', '\xe0', + '\x0f', '\x05', '\xcf', '\xae', '\x01', '\x00', '\x4c', '\x30', + '\x0f', '\x05', '\xcf', '\xae', '\x02', '\x00', '\x46', '\x20', + '\x65', '\xa6', '\x62', '\xaa', '\x24', '\xa6', '\x6f', '\x1e', + '\x42', '\x03', '\x00', '\x38', '\x7b', '\x86', '\xb1', '\xb9', + '\x6f', '\x0e', '\x12', '\x03', '\x00', '\x38', '\x6f', '\xae', + '\xf2', '\x18', '\x00', '\x38', '\xb0', '\xb9', '\x66', '\xa6', + '\x7b', '\x86', '\xb1', '\xb9', '\x6f', '\xae', '\xfe', '\x18', + '\x00', '\x38', '\xb0', '\xb9', '\x62', '\xa6', '\x64', '\xb6', + '\x3f', '\xbd', '\x5a', '\x11', '\x00', '\x38', '\x41', '\x92', + '\xc3', '\x9b', '\x11', '\x31', '\x6d', '\x9e', '\x01', '\x92', + '\x58', '\xe0', '\xed', '\x9b', '\x65', '\xa6', '\xc3', '\xa3', + '\xa5', '\xa6', '\xc2', '\xa3', '\xa5', '\xa6', '\xc2', '\xa3', + '\x6f', '\xad', '\x3a', '\x19', '\x00', '\x38', '\x62', '\xae', + '\x24', '\xa6', '\x6f', '\x1e', '\x42', '\x03', '\x00', '\x38', + '\x7b', '\x86', '\xb1', '\xb9', '\x6f', '\x0e', '\x12', '\x03', + '\x00', '\x38', '\x6f', '\xae', '\x06', '\x19', '\x00', '\x38', + '\xb0', '\xb9', '\x66', '\xa6', '\x7b', '\x86', '\xb1', '\xb9', + '\x6f', '\xae', '\xfe', '\x18', '\x00', '\x38', '\xb0', '\xb9', + '\x62', '\xa6', '\x64', '\xb6', '\x67', '\xc6', '\x66', '\xd6', + '\x3f', '\xbd', '\xaa', '\x12', '\x00', '\x38', '\x0d', '\x31', + '\x6d', '\x9e', '\x26', '\x96', '\xed', '\x9b', '\x11', '\x31', + '\x70', '\x8a', '\x6f', '\xce', '\x12', '\x1a', '\x00', '\x38', + '\x0d', '\xc1', '\x69', '\x9a', '\x7f', '\x0d', '\x34', '\x1a', + '\x00', '\x38', '\x29', '\x9a', '\xe8', '\x96', '\xff', '\x1d', + '\x44', '\xfe', '\x0f', '\x05', '\x75', '\x86', '\x6f', '\x2e', + '\x3a', '\x19', '\x00', '\x38', '\x6f', '\x1e', '\x12', '\x1a', + '\x00', '\x38', '\x09', '\x11', '\xa0', '\x0b', '\x4c', '\x30', + '\x7b', '\x86', '\x62', '\xaa', '\x3f', '\xbd', '\x42', '\x03', + '\x00', '\x38', '\x6f', '\xae', '\x12', '\x19', '\x00', '\x38', + '\x3f', '\xbd', '\x12', '\x03', '\x00', '\x38', '\x70', '\x86', + '\x09', '\x11', '\xe0', '\x0a', '\x22', '\x00', '\x0f', '\x05', + '\x05', '\x11', '\x29', '\x0a', '\x01', '\x11', '\x6d', '\xda', + '\x62', '\x99', '\x59', '\x9a', '\x4d', '\x05', '\xd9', '\x9a', + '\xff', '\x2d', '\x9a', '\xfd', '\x0f', '\x05', '\x02', '\x02', + '\x09', '\x11', '\xe0', '\x0a', '\xe3', '\x10', '\x0f', '\x05', + '\x6f', '\xae', '\x22', '\x19', '\x00', '\x38', '\x3f', '\xbd', + '\x12', '\x03', '\x00', '\x38', '\x0f', '\x2c', '\x6c', '\x00', + '\x01', '\x52', '\xc1', '\x52', '\xa5', '\x80', '\x15', '\x12', + '\x7a', '\x86', '\xbe', '\x8f', '\x3e', '\x0d', '\x00', '\x00', + '\x7f', '\xb6', '\x0f', '\x05', '\x00', '\x00', '\x00', '\x00', + '\x0d', '\x0a', '\x0d', '\x0a', '\x44', '\x65', '\x76', '\x69', + '\x63', '\x65', '\x20', '\x49', '\x44', '\x20', '\x3d', '\x20', + '\x00', '\x00', '\x43', '\x68', '\x65', '\x63', '\x6b', '\x73', + '\x75', '\x6d', '\x20', '\x6f', '\x66', '\x20', '\x62', '\x6f', + '\x6f', '\x74', '\x6c', '\x6f', '\x61', '\x64', '\x65', '\x72', + '\x20', '\x69', '\x73', '\x20', '\x00', '\x00', '\x57', '\x61', + '\x69', '\x74', '\x69', '\x6e', '\x67', '\x20', '\x66', '\x6f', + '\x72', '\x20', '\x6c', '\x6f', '\x61', '\x64', '\x20', '\x69', + '\x6e', '\x66', '\x6f', '\x2e', '\x0d', '\x0a', '\x00', '\x00', + '\x47', '\x6f', '\x74', '\x20', '\x6c', '\x6f', '\x61', '\x64', + '\x20', '\x69', '\x6e', '\x66', '\x6f', '\x2e', '\x0d', '\x0a', + '\x00', '\x00', '\x50', '\x41', '\x43', '\x4b', '\x45', '\x54', + '\x5f', '\x49', '\x4e', '\x46', '\x4f', '\x0d', '\x0a', '\x00', + '\x53', '\x45', '\x54', '\x5f', '\x52', '\x45', '\x47', '\x49', + '\x53', '\x54', '\x45', '\x52', '\x0d', '\x0a', '\x00', '\x00', + '\x47', '\x45', '\x54', '\x5f', '\x52', '\x45', '\x47', '\x49', + '\x53', '\x54', '\x45', '\x52', '\x0d', '\x0a', '\x00', '\x00', + '\x50', '\x41', '\x55', '\x53', '\x45', '\x5f', '\x4c', '\x4f', + '\x4f', '\x50', '\x0d', '\x0a', '\x00', '\x00', '\x4d', '\x45', + '\x4d', '\x5f', '\x56', '\x45', '\x52', '\x49', '\x46', '\x59', + '\x0d', '\x0a', '\x00', '\x00', '\x76', '\x65', '\x72', '\x69', + '\x66', '\x79', '\x20', '\x66', '\x61', '\x69', '\x6c', '\x65', + '\x64', '\x0d', '\x0a', '\x00', '\x4d', '\x45', '\x4d', '\x5f', + '\x54', '\x45', '\x53', '\x54', '\x0d', '\x0a', '\x00', '\x00', + '\x23', '\x23', '\x23', '\x20', '\x4d', '\x65', '\x6d', '\x6f', + '\x72', '\x79', '\x20', '\x74', '\x65', '\x73', '\x74', '\x20', + '\x66', '\x61', '\x69', '\x6c', '\x65', '\x64', '\x20', '\x61', + '\x74', '\x20', '\x00', '\x00', '\x50', '\x61', '\x73', '\x73', + '\x65', '\x64', '\x20', '\x6d', '\x65', '\x6d', '\x6f', '\x72', + '\x79', '\x20', '\x74', '\x65', '\x73', '\x74', '\x2e', '\x0d', + '\x0a', '\x00', '\x4d', '\x45', '\x4d', '\x5f', '\x44', '\x55', + '\x4d', '\x50', '\x0d', '\x0a', '\x00', '\x00', '\x4d', '\x45', + '\x4d', '\x5f', '\x43', '\x4c', '\x45', '\x41', '\x52', '\x0d', + '\x0a', '\x00', '\x46', '\x4c', '\x41', '\x53', '\x48', '\x0d', + '\x0a', '\x00', '\x4a', '\x55', '\x4d', '\x50', '\x0d', '\x0a', + '\x00', '\x00', '\x45', '\x4e', '\x44', '\x0d', '\x0a', '\x00', + '\x23', '\x23', '\x23', '\x20', '\x55', '\x6e', '\x6b', '\x6e', + '\x6f', '\x77', '\x6e', '\x20', '\x74', '\x79', '\x70', '\x65', + '\x3a', '\x20', '\x00', '\x00', '\x43', '\x68', '\x65', '\x63', + '\x6b', '\x73', '\x75', '\x6d', '\x20', '\x6f', '\x66', '\x20', + '\x66', '\x69', '\x6c', '\x65', '\x20', '\x69', '\x73', '\x20', + '\x00', '\x00', '\x23', '\x23', '\x23', '\x20', '\x4d', '\x65', + '\x6d', '\x6f', '\x72', '\x79', '\x20', '\x74', '\x65', '\x73', + '\x74', '\x20', '\x31', '\x20', '\x66', '\x61', '\x69', '\x6c', + '\x65', '\x64', '\x20', '\x61', '\x74', '\x20', '\x00', '\x00', + '\x23', '\x23', '\x23', '\x20', '\x4d', '\x65', '\x6d', '\x6f', + '\x72', '\x79', '\x20', '\x74', '\x65', '\x73', '\x74', '\x20', + '\x32', '\x20', '\x66', '\x61', '\x69', '\x6c', '\x65', '\x64', + '\x20', '\x61', '\x74', '\x20', '\x00', '\x00', '\x20', '\x3a', + '\x00', '\x00', '\x38', '\x4d', '\x62', '\x20', '\x42', '\x42', + '\x00', '\x00', '\x38', '\x4d', '\x62', '\x20', '\x54', '\x42', + '\x00', '\x00', '\x31', '\x36', '\x4d', '\x62', '\x20', '\x42', + '\x42', '\x00', '\x31', '\x36', '\x4d', '\x62', '\x20', '\x54', + '\x42', '\x00', '\x33', '\x32', '\x4d', '\x62', '\x20', '\x54', + '\x42', '\x00', '\x55', '\x6e', '\x73', '\x75', '\x70', '\x70', + '\x6f', '\x72', '\x74', '\x65', '\x64', '\x20', '\x69', '\x6e', + '\x74', '\x65', '\x72', '\x6c', '\x65', '\x61', '\x76', '\x65', + '\x21', '\x0a', '\x00', '\x00', '\x46', '\x6f', '\x75', '\x6e', + '\x64', '\x20', '\x31', '\x20', '\x78', '\x20', '\x43', '\x46', + '\x49', '\x20', '\x61', '\x74', '\x20', '\x00', '\x54', '\x6f', + '\x6f', '\x20', '\x6d', '\x61', '\x6e', '\x79', '\x20', '\x72', + '\x65', '\x67', '\x69', '\x6f', '\x6e', '\x73', '\x20', '\x6f', + '\x6e', '\x20', '\x63', '\x68', '\x69', '\x70', '\x21', '\x0a', + '\x00', '\x00', '\x4e', '\x6f', '\x20', '\x73', '\x69', '\x6e', + '\x67', '\x6c', '\x65', '\x20', '\x78', '\x31', '\x36', '\x20', + '\x61', '\x74', '\x20', '\x00', '\x4e', '\x6f', '\x20', '\x69', + '\x6e', '\x74', '\x65', '\x72', '\x6c', '\x65', '\x61', '\x76', + '\x65', '\x64', '\x20', '\x78', '\x31', '\x36', '\x20', '\x61', + '\x74', '\x20', '\x00', '\x00', '\x46', '\x6f', '\x75', '\x6e', + '\x64', '\x20', '\x00', '\x00', '\x31', '\x00', '\x32', '\x00', + '\x20', '\x78', '\x20', '\x00', '\x46', '\x61', '\x74', '\x61', + '\x6c', '\x3a', '\x20', '\x66', '\x6c', '\x61', '\x73', '\x68', + '\x20', '\x69', '\x73', '\x20', '\x74', '\x6f', '\x6f', '\x20', + '\x73', '\x6d', '\x61', '\x6c', '\x6c', '\x2e', '\x0a', '\x00', + '\x53', '\x65', '\x63', '\x74', '\x6f', '\x72', '\x20', '\x65', + '\x72', '\x61', '\x73', '\x65', '\x20', '\x65', '\x72', '\x72', + '\x6f', '\x72', '\x0a', '\x00', '\x45', '\x72', '\x72', '\x6f', + '\x72', '\x20', '\x61', '\x74', '\x20', '\x00', '\x3a', '\x20', + '\x4e', '\x6f', '\x20', '\x6e', '\x65', '\x65', '\x64', '\x20', + '\x74', '\x6f', '\x20', '\x77', '\x72', '\x69', '\x74', '\x65', + '\x0a', '\x00', '\x3a', '\x20', '\x45', '\x72', '\x61', '\x73', + '\x69', '\x6e', '\x67', '\x20', '\x00', '\x00', '\x20', '\x62', + '\x79', '\x74', '\x65', '\x73', '\x0a', '\x00', '\x3a', '\x20', + '\x57', '\x72', '\x69', '\x74', '\x69', '\x6e', '\x67', '\x20', + '\x00', '\x00', '\x3a', '\x20', '\x56', '\x65', '\x72', '\x69', + '\x66', '\x79', '\x69', '\x6e', '\x67', '\x2e', '\x2e', '\x2e', + '\x00', '\x00', '\x4f', '\x4b', '\x0a', '\x00', '\xfa', '\x17', + '\x00', '\x38', '\x02', '\x18', '\x00', '\x38', '\x0a', '\x18', + '\x00', '\x38', '\x12', '\x18', '\x00', '\x38', '\x1a', '\x18', + '\x00', '\x38', '\x00', '\x00', '\x00', '\x80', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x84', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x54', '\x68', '\x69', '\x73', + '\x20', '\x62', '\x6f', '\x6f', '\x74', '\x6c', '\x6f', '\x61', + '\x64', '\x65', '\x72', '\x20', '\x77', '\x61', '\x73', '\x20', + '\x62', '\x75', '\x69', '\x6c', '\x74', '\x20', '\x62', '\x79', + '\x20', '\x72', '\x6f', '\x6f', '\x74', '\x20', '\x6f', '\x6e', + '\x20', '\x57', '\x65', '\x64', '\x20', '\x4d', '\x61', '\x79', + '\x20', '\x31', '\x36', '\x20', '\x32', '\x31', '\x3a', '\x33', + '\x31', '\x3a', '\x34', '\x34', '\x20', '\x43', '\x45', '\x53', + '\x54', '\x20', '\x32', '\x30', '\x30', '\x37', '\x2e', '\x0d', + '\x0a', '\x00' +}; diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/ser_noleds_ima.c b/target/linux/etrax-2.6/image/e100boot/src/sbl/ser_noleds_ima.c new file mode 100644 index 0000000000..70c599308c --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/ser_noleds_ima.c @@ -0,0 +1,807 @@ + +/* cconv 1.2 12/16/97, Copyright (C) 1997, Axis Communications AB */ + +const char ser_noleds_ima[] = +{ + '\x0f', '\x05', '\x0f', '\x05', '\x6f', '\xee', '\x00', '\x1f', + '\x00', '\x38', '\x3f', '\x0d', '\x08', '\x01', '\x00', '\x38', + '\x78', '\x56', '\x34', '\x12', '\x21', '\x43', '\x65', '\x87', + '\x6f', '\xde', '\x20', '\x00', '\x00', '\xb0', '\x5f', '\x9c', + '\x65', '\x6f', '\xed', '\x9b', '\x5f', '\x9c', '\x25', '\x2f', + '\x7f', '\x0d', '\xdc', '\x15', '\x00', '\x38', '\xe9', '\x9b', + '\xed', '\x9b', '\x3f', '\x0d', '\x28', '\x01', '\x00', '\x38', + '\xfc', '\xe1', '\x7e', '\xbe', '\x7f', '\x0d', '\x7e', '\x1a', + '\x00', '\x38', '\x70', '\x8a', '\x6f', '\x9e', '\x20', '\x00', + '\x00', '\xb0', '\x69', '\x9a', '\x79', '\x67', '\x7f', '\x0d', + '\x32', '\x1a', '\x00', '\x38', '\xe9', '\x9b', '\x6f', '\x9e', + '\x22', '\x00', '\x00', '\xb0', '\x59', '\x9a', '\x59', '\x94', + '\x7f', '\x0d', '\x9a', '\x1a', '\x00', '\x38', '\xe9', '\x9b', + '\x6f', '\x9e', '\x04', '\x00', '\x00', '\xb0', '\x69', '\x9a', + '\x06', '\x93', '\xe1', '\x93', '\x81', '\x92', '\x7f', '\x0d', + '\x82', '\x1a', '\x00', '\x38', '\xc9', '\x9b', '\x7f', '\x0d', + '\x44', '\x1a', '\x00', '\x38', '\x70', '\x4a', '\x3f', '\xbd', + '\x28', '\x02', '\x00', '\x38', '\x3f', '\xbd', '\xac', '\x02', + '\x00', '\x38', '\x3f', '\xbd', '\xcc', '\x01', '\x00', '\x38', + '\x6a', '\xa6', '\xf7', '\x30', '\x0f', '\x05', '\x6f', '\x9e', + '\x00', '\x01', '\x00', '\x38', '\x69', '\x9a', '\x7f', '\x0d', + '\x7e', '\x1a', '\x00', '\x38', '\xe9', '\x9a', '\x24', '\x80', + '\x0f', '\x05', '\x6f', '\x9e', '\x82', '\x1a', '\x00', '\x38', + '\x49', '\x9a', '\xcf', '\x9e', '\x01', '\x00', '\xd3', '\x20', + '\x0f', '\x05', '\x6f', '\xde', '\xd4', '\x01', '\x00', '\xb0', + '\x4d', '\x9a', '\x38', '\x93', '\x41', '\x93', '\xcd', '\x9b', + '\xc1', '\xe0', '\x0f', '\x05', '\x3e', '\xbe', '\x3f', '\x0d', + '\x6c', '\x03', '\x00', '\x38', '\xfc', '\xe1', '\x7e', '\xbe', + '\x3f', '\xbd', '\x68', '\x02', '\x00', '\x38', '\x6a', '\xa6', + '\x16', '\x20', '\x41', '\x92', '\x3f', '\xbd', '\xf4', '\x01', + '\x00', '\x38', '\x6a', '\xa6', '\x0a', '\x30', '\x79', '\x86', + '\x3f', '\xbd', '\xac', '\x02', '\x00', '\x38', '\x79', '\x86', + '\x69', '\xa6', '\x3e', '\x0d', '\x84', '\xe2', '\x6f', '\x9e', + '\x22', '\x00', '\x00', '\xb0', '\x59', '\x9a', '\x59', '\x94', + '\xee', '\x9b', '\x6f', '\xce', '\x9a', '\x1a', '\x00', '\x38', + '\x6c', '\x9a', '\x6e', '\xda', '\xad', '\x96', '\xb9', '\x96', + '\xdf', '\x9c', '\x80', '\x25', '\x0a', '\xd0', '\x0f', '\x05', + '\x6e', '\x9a', '\xec', '\x9b', '\x04', '\xe0', '\x41', '\xa2', + '\x7a', '\x86', '\x7f', '\xb6', '\x04', '\xe2', '\x00', '\x00', + '\x6f', '\x9e', '\xdc', '\x15', '\x00', '\x38', '\x79', '\x8a', + '\x7f', '\x0d', '\x64', '\x00', '\x00', '\xb0', '\x70', '\x8a', + '\x4f', '\xde', '\x55', '\x00', '\x7f', '\x0d', '\x63', '\x00', + '\x00', '\xb0', '\xcd', '\xdb', '\x0b', '\xd2', '\x7f', '\x0d', + '\x62', '\x00', '\x00', '\xb0', '\xcd', '\xdb', '\xa0', '\xd2', + '\xc9', '\xdb', '\x7f', '\x0d', '\x61', '\x00', '\x00', '\xb0', + '\xcd', '\xdb', '\x41', '\x92', '\x7f', '\x0d', '\x84', '\x1a', + '\x00', '\x38', '\xc9', '\x9b', '\x7f', '\xb6', '\x0f', '\x05', + '\x6f', '\x9e', '\x60', '\x00', '\x00', '\xb0', '\x69', '\x9a', + '\x59', '\xb4', '\x1f', '\xbf', '\xff', '\x01', '\x88', '\x93', + '\x2e', '\xa0', '\x0f', '\x05', '\x6f', '\xce', '\x7e', '\x1a', + '\x00', '\x38', '\x6c', '\x9a', '\x6f', '\xde', '\x04', '\x01', + '\x00', '\x38', '\x6d', '\x99', '\xcb', '\xbb', '\x01', '\x92', + '\xec', '\x9b', '\x6f', '\x9e', '\x22', '\x00', '\x00', '\xb0', + '\x49', '\x9a', '\x49', '\x94', '\x7f', '\x0d', '\x9a', '\x1a', + '\x00', '\x38', '\xe9', '\x9b', '\x7f', '\xb6', '\x41', '\xa2', + '\x7f', '\xb6', '\x7a', '\x86', '\x6f', '\x9e', '\x61', '\x00', + '\x00', '\xb0', '\x49', '\x9a', '\x85', '\x93', '\xf5', '\xa0', + '\x0f', '\x05', '\x4f', '\x9e', '\x2b', '\x00', '\x7f', '\x0d', + '\xdc', '\x15', '\x00', '\x38', '\xc9', '\x9b', '\x7f', '\x0d', + '\x60', '\x00', '\x00', '\xb0', '\xc9', '\x9b', '\x7f', '\xb6', + '\x0f', '\x05', '\x8a', '\x0b', '\x28', '\x30', '\x0f', '\x05', + '\x6f', '\x9e', '\x61', '\x00', '\x00', '\xb0', '\x49', '\x9a', + '\x85', '\x93', '\x14', '\xa0', '\x0f', '\x05', '\x6f', '\x9e', + '\xdc', '\x15', '\x00', '\x38', '\x4a', '\xde', '\xc9', '\xdb', + '\x7f', '\x0d', '\x60', '\x00', '\x00', '\xb0', '\xcd', '\xdb', + '\x8a', '\x0b', '\xdd', '\x20', '\x0f', '\x05', '\x7f', '\xb6', + '\x0f', '\x05', '\xfc', '\xe1', '\x7e', '\xbe', '\x8e', '\xe2', + '\x4f', '\x9e', '\x30', '\x00', '\x01', '\xe1', '\xc9', '\x9b', + '\x4f', '\xde', '\x78', '\x00', '\x02', '\xe1', '\xcd', '\xdb', + '\x4d', '\x92', '\x0b', '\xe1', '\xc9', '\x9b', '\x4a', '\xd2', + '\x0c', '\xe1', '\xcd', '\xdb', '\x0d', '\xe1', '\x70', '\x0a', + '\x4b', '\xb6', '\x06', '\x20', '\x7c', '\x86', '\x0b', '\xe1', + '\x70', '\x0a', '\x6c', '\x96', '\xc2', '\x93', '\x6a', '\xb6', + '\xe9', '\xb7', '\x4b', '\xd6', '\x0f', '\xd3', '\xcf', '\xde', + '\x09', '\x00', '\x04', '\x80', '\x49', '\x92', '\x07', '\xd2', + '\xac', '\x96', '\x4e', '\xb2', '\x2e', '\xb6', '\x2b', '\x96', + '\x30', '\xd2', '\xf3', '\x91', '\xcd', '\xdb', '\x01', '\xc2', + '\xc8', '\xc2', '\xd9', '\x20', '\x6c', '\x96', '\x6e', '\xa6', + '\x01', '\xa2', '\x3f', '\xbd', '\xd2', '\x02', '\x00', '\x38', + '\x0e', '\xe2', '\x3e', '\x0d', '\xfc', '\xe1', '\x7e', '\xbe', + '\x84', '\xe2', '\xfe', '\x0b', '\x6f', '\x0e', '\xd2', '\x02', + '\x00', '\x38', '\x6f', '\xae', '\xe0', '\x15', '\x00', '\x38', + '\xb0', '\xb9', '\x6f', '\xae', '\x32', '\x1a', '\x00', '\x38', + '\x6a', '\xaa', '\x7a', '\x67', '\x41', '\xb2', '\x3f', '\xbd', + '\x02', '\x03', '\x00', '\x38', '\x6f', '\xae', '\xac', '\x19', + '\x00', '\x38', '\xb0', '\xb9', '\x6f', '\x9e', '\xf0', '\x00', + '\x00', '\x38', '\xef', '\x9e', '\xf2', '\x19', '\x00', '\x38', + '\x0e', '\x30', '\x70', '\x86', '\x09', '\x0c', '\xef', '\x9e', + '\xf2', '\x19', '\x00', '\x38', '\xf7', '\x20', '\x0f', '\x05', + '\x6f', '\xae', '\xf2', '\x15', '\x00', '\x38', '\x3f', '\xbd', + '\xd2', '\x02', '\x00', '\x38', '\x60', '\xa6', '\x41', '\xb2', + '\x3f', '\xbd', '\x02', '\x03', '\x00', '\x38', '\x3f', '\xbd', + '\xe2', '\x03', '\x00', '\x38', '\x3f', '\x0d', '\x28', '\x01', + '\x00', '\x38', '\xbe', '\x0f', '\x3e', '\x0d', '\xff', '\xe0', + '\x0f', '\x05', '\xfc', '\xe1', '\x7e', '\xbe', '\x84', '\xe2', + '\xfe', '\x0b', '\x6f', '\x0e', '\xd2', '\x02', '\x00', '\x38', + '\x6f', '\xae', '\x0e', '\x16', '\x00', '\x38', '\xb0', '\xb9', + '\x3f', '\xbd', '\xac', '\x02', '\x00', '\x38', '\x6f', '\xae', + '\x00', '\x1f', '\x00', '\x38', '\x5f', '\xbc', '\xec', '\x01', + '\x3f', '\xbd', '\x60', '\x07', '\x00', '\x38', '\x6f', '\xae', + '\x28', '\x16', '\x00', '\x38', '\xb0', '\xb9', '\x3f', '\xbd', + '\x26', '\x04', '\x00', '\x38', '\xbe', '\x0f', '\x3e', '\xbe', + '\x3f', '\x0d', '\xde', '\x03', '\x00', '\x38', '\xfc', '\xe1', + '\x7e', '\xbe', '\x98', '\xe2', '\xfe', '\x4b', '\x6f', '\xde', + '\x00', '\x1f', '\x00', '\x38', '\x6d', '\x9a', '\x79', '\x67', + '\xed', '\x9f', '\xef', '\xde', '\xec', '\x20', '\x00', '\x38', + '\xf3', '\x20', '\x0f', '\x05', '\x6f', '\x3e', '\x00', '\x1f', + '\x00', '\x38', '\xa3', '\x0b', '\xff', '\x3d', '\xfe', '\x02', + '\x0f', '\x05', '\x63', '\x9a', '\x81', '\x92', '\xcf', '\x9d', + '\x0b', '\x00', '\x5f', '\x95', '\x3f', '\xf8', '\x54', '\x02', + '\x22', '\x01', '\x18', '\x00', '\x62', '\x00', '\x90', '\x00', + '\x96', '\x01', '\xc8', '\x01', '\xe4', '\x00', '\x00', '\x02', + '\xb8', '\x00', '\x9a', '\x02', '\xce', '\x02', '\x6f', '\xae', + '\x3a', '\x16', '\x00', '\x38', '\x3f', '\xbd', '\xd2', '\x02', + '\x00', '\x38', '\x6f', '\x0e', '\x02', '\x03', '\x00', '\x38', + '\x04', '\x31', '\x62', '\xae', '\x41', '\xb2', '\xb0', '\xb9', + '\x08', '\x31', '\x61', '\xae', '\x41', '\xb2', '\xb0', '\xb9', + '\x6f', '\x0e', '\x86', '\x1a', '\x00', '\x38', '\x60', '\x9a', + '\x81', '\x92', '\xe0', '\x9b', '\x3f', '\xbd', '\xac', '\x02', + '\x00', '\x38', '\x60', '\x9a', '\x01', '\x92', '\xe0', '\x9b', + '\x62', '\xaa', '\x61', '\xba', '\x3f', '\xbd', '\x60', '\x07', + '\x00', '\x38', '\xff', '\xed', '\x88', '\x02', '\x0c', '\x32', + '\x6f', '\xae', '\x48', '\x16', '\x00', '\x38', '\x3f', '\xbd', + '\xd2', '\x02', '\x00', '\x38', '\x6f', '\x0e', '\x02', '\x03', + '\x00', '\x38', '\x04', '\x31', '\x62', '\xae', '\x41', '\xb2', + '\xb0', '\xb9', '\x08', '\x31', '\x61', '\xae', '\x41', '\xb2', + '\xb0', '\xb9', '\x61', '\x1a', '\x72', '\x09', '\xe1', '\x1b', + '\xff', '\xed', '\x5a', '\x02', '\x0c', '\x32', '\x6f', '\xae', + '\x58', '\x16', '\x00', '\x38', '\x3f', '\xbd', '\xd2', '\x02', + '\x00', '\x38', '\x6f', '\x1e', '\x02', '\x03', '\x00', '\x38', + '\x04', '\x31', '\x60', '\xae', '\x41', '\xb2', '\xb1', '\xb9', + '\x60', '\xaa', '\x6a', '\xaa', '\x41', '\xb2', '\xb1', '\xb9', + '\xff', '\xed', '\x32', '\x02', '\x08', '\x32', '\x6f', '\xae', + '\x68', '\x16', '\x00', '\x38', '\x3f', '\xbd', '\xd2', '\x02', + '\x00', '\x38', '\x04', '\x31', '\x60', '\xae', '\x41', '\xb2', + '\x3f', '\xbd', '\x02', '\x03', '\x00', '\x38', '\x60', '\xaa', + '\xff', '\x3d', '\xc0', '\x01', '\x0f', '\x05', '\x81', '\xa2', + '\xfd', '\x20', '\x0f', '\x05', '\xff', '\xed', '\x06', '\x02', + '\x08', '\x32', '\x6f', '\x4e', '\xd2', '\x02', '\x00', '\x38', + '\x6f', '\xae', '\x76', '\x16', '\x00', '\x38', '\xb4', '\xb9', + '\x6f', '\x0e', '\x02', '\x03', '\x00', '\x38', '\x04', '\x31', + '\x62', '\xae', '\x41', '\xb2', '\xb0', '\xb9', '\x08', '\x31', + '\x61', '\xae', '\x41', '\xb2', '\xb0', '\xb9', '\x62', '\x2a', + '\x62', '\x2a', '\xe1', '\x2a', '\xff', '\x3d', '\xb8', '\x01', + '\x0f', '\x05', '\x6f', '\xae', '\x84', '\x16', '\x00', '\x38', + '\xb4', '\xb9', '\xff', '\xed', '\xd0', '\x01', '\x0f', '\x05', + '\x6f', '\x4e', '\xd2', '\x02', '\x00', '\x38', '\x6f', '\xae', + '\x94', '\x16', '\x00', '\x38', '\xb4', '\xb9', '\x6f', '\x2e', + '\x02', '\x03', '\x00', '\x38', '\x04', '\x31', '\x61', '\xae', + '\x41', '\xb2', '\xb2', '\xb9', '\x08', '\x31', '\x60', '\xae', + '\x41', '\xb2', '\xb2', '\xb9', '\x61', '\xaa', '\x60', '\xba', + '\x6e', '\xc6', '\x14', '\xc2', '\x3f', '\xbd', '\x5e', '\x08', + '\x00', '\x38', '\x6a', '\xa6', '\x30', '\x20', '\x0f', '\x05', + '\x6f', '\xae', '\xa0', '\x16', '\x00', '\x38', '\xb4', '\xb9', + '\x14', '\xe1', '\x6a', '\xaa', '\x41', '\xb2', '\xb2', '\xb9', + '\x14', '\xe1', '\x6a', '\xaa', '\x6a', '\xb6', '\x0f', '\xbc', + '\x40', '\x00', '\x8f', '\xac', '\x40', '\x00', '\x3c', '\xa3', + '\x3c', '\xb3', '\x3f', '\xbd', '\x06', '\x09', '\x00', '\x38', + '\xff', '\xed', '\x6a', '\x01', '\x0f', '\x05', '\x6f', '\xae', + '\xbc', '\x16', '\x00', '\x38', '\xb4', '\xb9', '\xff', '\xed', + '\x54', '\x01', '\x0c', '\x32', '\x6f', '\xae', '\xd2', '\x16', + '\x00', '\x38', '\x3f', '\xbd', '\xd2', '\x02', '\x00', '\x38', + '\x6f', '\x0e', '\x02', '\x03', '\x00', '\x38', '\x04', '\x31', + '\x62', '\xae', '\x41', '\xb2', '\xb0', '\xb9', '\x08', '\x31', + '\x61', '\xae', '\x41', '\xb2', '\xb0', '\xb9', '\x62', '\xaa', + '\x61', '\xba', '\x3f', '\xbd', '\x06', '\x09', '\x00', '\x38', + '\xff', '\xed', '\x22', '\x01', '\x0c', '\x32', '\x6f', '\xae', + '\xde', '\x16', '\x00', '\x38', '\x3f', '\xbd', '\xd2', '\x02', + '\x00', '\x38', '\x6f', '\x0e', '\x02', '\x03', '\x00', '\x38', + '\x04', '\x31', '\x62', '\xae', '\x41', '\xb2', '\xb0', '\xb9', + '\x08', '\x31', '\x61', '\xae', '\x41', '\xb2', '\xb0', '\xb9', + '\x62', '\xaa', '\xe1', '\xaa', '\xda', '\x90', '\x0f', '\x05', + '\x7a', '\x0e', '\x08', '\x31', '\xea', '\xaa', '\xf9', '\x80', + '\x0f', '\x05', '\xea', '\xe0', '\x0c', '\x32', '\x6f', '\xae', + '\xea', '\x16', '\x00', '\x38', '\x3f', '\xbd', '\xd2', '\x02', + '\x00', '\x38', '\x6f', '\x0e', '\x02', '\x03', '\x00', '\x38', + '\x04', '\x31', '\x61', '\xae', '\x41', '\xb2', '\xb0', '\xb9', + '\x08', '\x31', '\x64', '\xae', '\x41', '\xb2', '\xb0', '\xb9', + '\x0c', '\x31', '\x62', '\xae', '\x41', '\xb2', '\xb0', '\xb9', + '\x6f', '\x0e', '\xa6', '\x12', '\x00', '\x38', '\x61', '\xaa', + '\x64', '\xba', '\x62', '\xca', '\xb0', '\xb9', '\x6a', '\xa6', + '\xac', '\x30', '\x10', '\x32', '\xc3', '\xa2', '\xae', '\x20', + '\x7a', '\x86', '\x62', '\xca', '\xef', '\xcd', '\x00', '\x00', + '\x01', '\x00', '\x64', '\xba', '\xb0', '\xb9', '\x9e', '\xe0', + '\x0f', '\x05', '\x6f', '\xde', '\x10', '\x1a', '\x00', '\x38', + '\x6d', '\x9a', '\x7f', '\x0d', '\xc0', '\x01', '\x00', '\xb0', + '\xe9', '\x9b', '\x04', '\xd1', '\x59', '\x98', '\x7f', '\x0d', + '\xc4', '\x01', '\x00', '\xb0', '\xe9', '\x9b', '\x6f', '\x1e', + '\xd2', '\x02', '\x00', '\x38', '\x6f', '\xae', '\xf2', '\x16', + '\x00', '\x38', '\xb1', '\xb9', '\x04', '\x31', '\x60', '\xae', + '\x41', '\xb2', '\x3f', '\xbd', '\x02', '\x03', '\x00', '\x38', + '\x6f', '\xae', '\xfa', '\x16', '\x00', '\x38', '\xb1', '\xb9', + '\x60', '\x9a', '\xb9', '\x09', '\x50', '\xe0', '\x08', '\x32', + '\x6f', '\xae', '\x6e', '\x16', '\x00', '\x38', '\x3f', '\xbd', + '\xd2', '\x02', '\x00', '\x38', '\x6f', '\x0e', '\x02', '\x03', + '\x00', '\x38', '\x04', '\x31', '\x61', '\xae', '\x41', '\xb2', + '\xb0', '\xb9', '\x08', '\x31', '\x62', '\xae', '\x41', '\xb2', + '\xb0', '\xb9', '\x61', '\x1a', '\x61', '\x9a', '\x08', '\x30', + '\x81', '\x92', '\xe1', '\x9b', '\x20', '\xe0', '\x62', '\x3a', + '\x1c', '\xe0', '\x0c', '\x32', '\x6f', '\xae', '\x00', '\x17', + '\x00', '\x38', '\x3f', '\xbd', '\xd2', '\x02', '\x00', '\x38', + '\x63', '\xaa', '\x41', '\xb2', '\x3f', '\xbd', '\x02', '\x03', + '\x00', '\x38', '\x0a', '\xe0', '\x0f', '\x05', '\xa3', '\x0b', + '\xff', '\x2d', '\x06', '\xfd', '\x0f', '\x05', '\x6f', '\xae', + '\xfa', '\x16', '\x00', '\x38', '\x3f', '\xbd', '\xd2', '\x02', + '\x00', '\x38', '\xbe', '\x4f', '\x04', '\xe2', '\x3e', '\x0d', + '\xfc', '\xe1', '\x7e', '\xbe', '\x8c', '\xe2', '\xfe', '\x2b', + '\x6a', '\x26', '\x6b', '\x06', '\x7f', '\x0d', '\x7e', '\x1a', + '\x00', '\x38', '\x70', '\x8a', '\x7f', '\x0d', '\x04', '\x01', + '\x00', '\x38', '\xea', '\xab', '\x6f', '\x9e', '\x82', '\x1a', + '\x00', '\x38', '\x49', '\x9a', '\xcf', '\x9e', '\x01', '\x00', + '\x86', '\x20', '\x0f', '\x05', '\x6f', '\xde', '\x36', '\x1a', + '\x00', '\x38', '\x08', '\xd1', '\xea', '\xab', '\x7f', '\x0d', + '\x00', '\x01', '\x00', '\x38', '\xeb', '\xbb', '\x6b', '\x96', + '\x04', '\x92', '\xdf', '\x9d', '\xdc', '\x05', '\xdd', '\x9b', + '\x6f', '\x9e', '\xa4', '\x01', '\x00', '\xb0', '\x69', '\xda', + '\x6f', '\xde', '\x00', '\x1a', '\x00', '\x38', '\xe9', '\xdb', + '\x6f', '\xde', '\xd4', '\x01', '\x00', '\xb0', '\x4d', '\x9a', + '\x38', '\x93', '\x44', '\x93', '\xcd', '\x9b', '\x6f', '\xde', + '\xd4', '\x01', '\x00', '\xb0', '\x4d', '\x9a', '\x07', '\x93', + '\xcf', '\x9e', '\x04', '\x00', '\xf7', '\x30', '\x0f', '\x05', + '\x4d', '\x9a', '\x38', '\x93', '\x41', '\x93', '\xcd', '\x9b', + '\x3f', '\xbd', '\xcc', '\x01', '\x00', '\x38', '\x6a', '\xa6', + '\xf7', '\x30', '\x0f', '\x05', '\x6f', '\xce', '\x7e', '\x1a', + '\x00', '\x38', '\xec', '\x0a', '\x10', '\x80', '\x0f', '\x05', + '\x6f', '\xde', '\xd4', '\x01', '\x00', '\xb0', '\x4d', '\x9a', + '\x38', '\x93', '\x41', '\x93', '\xcd', '\x9b', '\xec', '\x0a', + '\xd7', '\x90', '\x71', '\x86', '\x22', '\xe0', '\x62', '\x96', + '\x7f', '\x0d', '\x7e', '\x1a', '\x00', '\x38', '\xeb', '\xba', + '\x14', '\x80', '\x71', '\x86', '\x3f', '\xbd', '\xcc', '\x01', + '\x00', '\x38', '\x7f', '\x0d', '\x7e', '\x1a', '\x00', '\x38', + '\xe0', '\x0a', '\xf1', '\x90', '\x71', '\x86', '\x62', '\x96', + '\x20', '\x96', '\xe9', '\x26', '\x0e', '\x30', '\x62', '\xd6', + '\x0d', '\x1c', '\x62', '\x96', '\x20', '\x96', '\xe9', '\xd6', + '\xf7', '\x20', '\x0f', '\x05', '\x6f', '\xae', '\x14', '\x17', + '\x00', '\x38', '\x3f', '\xbd', '\xd2', '\x02', '\x00', '\x38', + '\x61', '\xa6', '\x41', '\xb2', '\xbe', '\x2f', '\x3e', '\xbe', + '\x3f', '\x0d', '\x02', '\x03', '\x00', '\x38', '\xfc', '\xe1', + '\x7e', '\xbe', '\x8c', '\xe2', '\xfe', '\x2b', '\x6b', '\x06', + '\x6c', '\x26', '\xeb', '\xa6', '\x40', '\x00', '\x6a', '\xc6', + '\xe0', '\xc6', '\x32', '\x00', '\x71', '\x86', '\x6c', '\xb6', + '\x6c', '\x96', '\x79', '\x87', '\x61', '\xd6', '\xc3', '\xd3', + '\xed', '\x97', '\x49', '\xd6', '\xcb', '\x9b', '\x4b', '\x9a', + '\xcd', '\x96', '\x0c', '\x30', '\x7d', '\x87', '\x6f', '\xae', + '\x2a', '\x17', '\x00', '\x38', '\x40', '\xe0', '\xe2', '\xbb', + '\xcb', '\xdf', '\x01', '\x12', '\xc4', '\x12', '\x06', '\x30', + '\xe0', '\xb6', '\xd7', '\x10', '\x6c', '\x96', '\x04', '\xc2', + '\xe0', '\xc6', '\xc5', '\x10', '\x0f', '\x05', '\xe0', '\xa6', + '\x4e', '\x00', '\x6a', '\xc6', '\xe0', '\xc6', '\x40', '\x00', + '\x71', '\x86', '\x6c', '\xa6', '\x61', '\x96', '\xc3', '\x93', + '\x6c', '\xd6', '\xe9', '\xd7', '\x4a', '\x9a', '\xcd', '\x96', + '\x22', '\x30', '\x01', '\x12', '\x81', '\x12', '\xe2', '\xab', + '\x6f', '\xae', '\x48', '\x17', '\x00', '\x38', '\x3f', '\xbd', + '\xd2', '\x02', '\x00', '\x38', '\x62', '\xaa', '\x41', '\xb2', + '\x3f', '\xbd', '\x02', '\x03', '\x00', '\x38', '\x7a', '\x86', + '\xbe', '\x2f', '\x3e', '\x0d', '\xc4', '\x12', '\x08', '\x30', + '\x01', '\xa2', '\xe0', '\xa6', '\xc9', '\x10', '\x61', '\x96', + '\x04', '\xc2', '\xe0', '\xc6', '\xb7', '\x10', '\x0f', '\x05', + '\x41', '\xa2', '\xbe', '\x2f', '\x3e', '\x0d', '\xfc', '\xe1', + '\x7e', '\xbe', '\x94', '\xe2', '\xfe', '\x4b', '\x6b', '\x26', + '\xeb', '\xa6', '\x5a', '\x90', '\x6a', '\x06', '\x60', '\xa6', + '\x7b', '\x86', '\x3f', '\xbd', '\x02', '\x03', '\x00', '\x38', + '\x6f', '\xae', '\x66', '\x17', '\x00', '\x38', '\x3f', '\xbd', + '\xd2', '\x02', '\x00', '\x38', '\xe2', '\x06', '\x2a', '\x90', + '\x74', '\x86', '\x60', '\x16', '\x60', '\x36', '\x6f', '\xae', + '\xbc', '\x17', '\x00', '\x38', '\x3f', '\xbd', '\xd2', '\x02', + '\x00', '\x38', '\x63', '\xae', '\x7b', '\x86', '\x3f', '\xbd', + '\x02', '\x03', '\x00', '\x38', '\x01', '\x42', '\xc4', '\x42', + '\x08', '\x30', '\x04', '\x12', '\xe2', '\x16', '\xdf', '\x80', + '\x0f', '\x05', '\x6f', '\xae', '\x24', '\x16', '\x00', '\x38', + '\x3f', '\xbd', '\xd2', '\x02', '\x00', '\x38', '\x10', '\x02', + '\xe2', '\x06', '\xad', '\x80', '\x60', '\xa6', '\xbe', '\x4f', + '\x3e', '\x0d', '\x00', '\x00', '\x05', '\xa1', '\x49', '\x98', + '\xc2', '\x92', '\x0a', '\x30', '\xc4', '\x92', '\x0e', '\x30', + '\x0f', '\x05', '\x7f', '\xb6', '\x7a', '\x86', '\x6a', '\xb9', + '\x5a', '\xa8', '\x7f', '\xb6', '\x0f', '\x05', '\x6a', '\xb9', + '\x6a', '\xaa', '\x7f', '\xb6', '\x0f', '\x05', '\x6a', '\xd6', + '\x05', '\xa1', '\x4a', '\xaa', '\x4a', '\x94', '\xc2', '\x92', + '\x0a', '\x30', '\xc4', '\x92', '\x10', '\x30', '\x0f', '\x05', + '\x7f', '\xb6', '\x7a', '\x86', '\x5c', '\xca', '\x6d', '\xb9', + '\xdc', '\xcb', '\x7f', '\xb6', '\x4a', '\xa4', '\x6c', '\xca', + '\x6d', '\xb9', '\xec', '\xcb', '\x4a', '\xa4', '\x7f', '\xb6', + '\x0f', '\x05', '\xfc', '\xe1', '\x7e', '\xbe', '\x84', '\xe2', + '\xee', '\xbb', '\x04', '\xa1', '\x49', '\x9a', '\xcf', '\x9e', + '\x01', '\x00', '\x06', '\x20', '\x0f', '\x05', '\x24', '\xe0', + '\xc1', '\xc3', '\xcf', '\x9e', '\x02', '\x00', '\x0c', '\x20', + '\x6b', '\x96', '\xd0', '\x93', '\x69', '\xb7', '\xee', '\xbb', + '\x12', '\xe0', '\xc2', '\xc3', '\x6f', '\xae', '\x92', '\x17', + '\x00', '\x38', '\x3f', '\xbd', '\xd2', '\x02', '\x00', '\x38', + '\x0c', '\xe0', '\x0f', '\x05', '\x6c', '\xb6', '\x6e', '\xc6', + '\x3f', '\xbd', '\x96', '\x09', '\x00', '\x38', '\x04', '\xe2', + '\x3e', '\x0d', '\xfc', '\xe1', '\x7e', '\xbe', '\x84', '\xe2', + '\xfe', '\x0b', '\x6a', '\x06', '\x4f', '\xbc', '\xaa', '\x00', + '\x5f', '\xcc', '\x55', '\x05', '\x3f', '\xbd', '\xc2', '\x09', + '\x00', '\x38', '\x60', '\xa6', '\x4f', '\xbc', '\x55', '\x00', + '\x5f', '\xcc', '\xaa', '\x02', '\xbe', '\x0f', '\x3e', '\xbe', + '\x3f', '\x0d', '\xc2', '\x09', '\x00', '\x38', '\xfc', '\xe1', + '\x7e', '\xbe', '\x90', '\xe2', '\xfe', '\x3b', '\x6a', '\x26', + '\x04', '\xa1', '\x49', '\x9a', '\xcf', '\x9e', '\x02', '\x00', + '\x42', '\x20', '\x6b', '\x36', '\x6f', '\x0e', '\x74', '\x09', + '\x00', '\x38', '\xb0', '\xb9', '\x6a', '\x16', '\x62', '\xa6', + '\x63', '\xb6', '\xb0', '\xb9', '\x61', '\xd6', '\xf0', '\xd3', + '\x1f', '\xdf', '\x40', '\x00', '\x6a', '\x96', '\xf0', '\x93', + '\x1f', '\x9f', '\x40', '\x00', '\xe9', '\xd6', '\x14', '\x20', + '\x7c', '\x86', '\x2f', '\x1f', '\x40', '\x00', '\x00', '\x00', + '\x2f', '\xaf', '\x40', '\x00', '\x00', '\x00', '\xea', '\x16', + '\x04', '\x30', '\x0f', '\x05', '\x41', '\xc2', '\x6c', '\xa6', + '\xbe', '\x3f', '\x3e', '\x0d', '\x6f', '\x1e', '\x74', '\x09', + '\x00', '\x38', '\xb1', '\xb9', '\x4a', '\x04', '\x0f', '\x0f', + '\x40', '\x00', '\x62', '\xa6', '\x63', '\xb6', '\xb1', '\xb9', + '\x2f', '\xaf', '\x40', '\x00', '\x00', '\x00', '\xea', '\x06', + '\x3a', '\x25', '\xbe', '\x3f', '\x3e', '\x0d', '\xfc', '\xe1', + '\x7e', '\xbe', '\xa8', '\xe2', '\xfe', '\x8b', '\x6a', '\x36', + '\x04', '\xa1', '\x44', '\x9e', '\xcf', '\x9e', '\x02', '\x00', + '\x04', '\x20', '\x41', '\x72', '\x42', '\x72', '\x6f', '\x2e', + '\xc2', '\x09', '\x00', '\x38', '\x4f', '\xbc', '\x98', '\x00', + '\x4f', '\xcc', '\x55', '\x00', '\xb2', '\xb9', '\x50', '\xb2', + '\xe7', '\xb4', '\x6f', '\x1e', '\x74', '\x09', '\x00', '\x38', + '\x63', '\xa6', '\xb1', '\xb9', '\xcf', '\xae', '\x51', '\x00', + '\xff', '\x2d', '\x9c', '\x01', '\x63', '\xa6', '\x51', '\xb2', + '\xe7', '\xb4', '\xb1', '\xb9', '\xcf', '\xae', '\x52', '\x00', + '\xff', '\x2d', '\x8c', '\x01', '\x63', '\xa6', '\x52', '\xb2', + '\xe7', '\xb4', '\xb1', '\xb9', '\xcf', '\xae', '\x59', '\x00', + '\xff', '\x2d', '\x7c', '\x01', '\x63', '\xa6', '\x24', '\xe1', + '\x70', '\x8a', '\x6f', '\xae', '\xac', '\x17', '\x00', '\x38', + '\x3f', '\xbd', '\xd2', '\x02', '\x00', '\x38', '\x63', '\xaa', + '\x41', '\xb2', '\x3f', '\xbd', '\x02', '\x03', '\x00', '\x38', + '\x4f', '\xbc', '\x27', '\x00', '\xe7', '\xb4', '\x63', '\xa6', + '\xb1', '\xb9', '\x41', '\x92', '\xea', '\x94', '\x06', '\x32', + '\xe3', '\x9b', '\x86', '\x32', '\x4f', '\xbc', '\x2c', '\x00', + '\xe7', '\xb4', '\x63', '\xa6', '\xb1', '\xb9', '\x6a', '\x86', + '\x55', '\xb2', '\xe7', '\xb4', '\x63', '\xa6', '\xb1', '\xb9', + '\x6a', '\x06', '\x6a', '\xb6', '\x04', '\xb2', '\xe7', '\xb4', + '\x63', '\xa6', '\xb1', '\xb9', '\xcf', '\xae', '\x30', '\x00', + '\x3e', '\x20', '\x63', '\xa6', '\x4f', '\xbc', '\xf0', '\x00', + '\x5f', '\xcc', '\x55', '\x05', '\xb2', '\xb9', '\x63', '\xa6', + '\x3f', '\xbd', '\x0a', '\x0a', '\x00', '\x38', '\x63', '\xa6', + '\x4f', '\xbc', '\x90', '\x00', '\x5f', '\xcc', '\x55', '\x05', + '\xb2', '\xb9', '\x44', '\xb8', '\x2b', '\xb6', '\x63', '\xa6', + '\xb1', '\xb9', '\x4a', '\x54', '\x0f', '\x5f', '\x80', '\xff', + '\x63', '\xa6', '\x4f', '\xbc', '\x98', '\x00', '\x4f', '\xcc', + '\x55', '\x00', '\xb2', '\xb9', '\x10', '\xe0', '\x0f', '\x05', + '\x0f', '\x02', '\xe7', '\x04', '\x60', '\xb6', '\xb1', '\xb9', + '\xcf', '\xae', '\x03', '\x00', '\x35', '\x35', '\x0a', '\x31', + '\xd8', '\x8b', '\xc8', '\x82', '\x12', '\xd0', '\x68', '\x46', + '\x6f', '\xae', '\xbe', '\x17', '\x00', '\x38', '\x3f', '\xbd', + '\xd2', '\x02', '\x00', '\x38', '\xd2', '\xe0', '\x7a', '\x86', + '\x65', '\x56', '\x94', '\x20', '\x81', '\x42', '\x90', '\xe0', + '\x74', '\x86', '\xc2', '\x03', '\x60', '\xb6', '\x2f', '\xb2', + '\xe7', '\xb4', '\x6f', '\x1e', '\x74', '\x09', '\x00', '\x38', + '\x63', '\xa6', '\xb1', '\xb9', '\x6a', '\x66', '\x60', '\xb6', + '\x30', '\xb2', '\xe7', '\xb4', '\x63', '\xa6', '\xb1', '\xb9', + '\xc8', '\xa3', '\x6a', '\x67', '\xc8', '\x63', '\x60', '\xb6', + '\x2d', '\xb2', '\xe7', '\xb4', '\x63', '\xa6', '\xb1', '\xb9', + '\x6a', '\x26', '\x2e', '\x02', '\xe7', '\x04', '\x63', '\xa6', + '\x60', '\xb6', '\xb1', '\xb9', '\xc8', '\xa3', '\x6a', '\x27', + '\x65', '\x56', '\x0a', '\x30', '\x01', '\x22', '\x68', '\x96', + '\xa4', '\x96', '\x04', '\xe0', '\x81', '\x92', '\x64', '\x96', + '\x19', '\x95', '\x63', '\xd6', '\x2d', '\x95', '\x6d', '\x96', + '\x24', '\xe1', '\x6d', '\xda', '\x0c', '\x91', '\xed', '\xdb', + '\x10', '\x91', '\xe6', '\x6b', '\x14', '\x91', '\xe2', '\x2b', + '\x62', '\x26', '\x10', '\xd0', '\x0f', '\x05', '\x24', '\xe1', + '\x29', '\x6a', '\x24', '\xe1', '\xe9', '\x9b', '\x81', '\x22', + '\xf5', '\x20', '\x0f', '\x05', '\x24', '\xe1', '\x6d', '\xda', + '\x06', '\x31', '\xed', '\xda', '\x1e', '\x30', '\x65', '\x56', + '\x06', '\x30', '\x01', '\x42', '\x81', '\x42', '\x81', '\x42', + '\x65', '\x56', '\x0c', '\x30', '\xe8', '\x46', '\x64', '\x46', + '\x69', '\xa0', '\x64', '\x06', '\x08', '\xe0', '\x63', '\xa6', + '\x61', '\xb0', '\x64', '\x06', '\x63', '\xa6', '\x4f', '\xbc', + '\xf0', '\x00', '\x5f', '\xcc', '\x55', '\x05', '\x3f', '\xbd', + '\xc2', '\x09', '\x00', '\x38', '\x12', '\xe0', '\x41', '\xa2', + '\x4f', '\xbc', '\xf0', '\x00', '\x5f', '\xcc', '\x55', '\x05', + '\x3f', '\xbd', '\xc2', '\x09', '\x00', '\x38', '\x7a', '\x86', + '\xbe', '\x8f', '\x04', '\xe2', '\x3e', '\x0d', '\xfc', '\xe1', + '\x7e', '\xbe', '\x90', '\xe2', '\xfe', '\x3b', '\x06', '\xa1', + '\xa0', '\x0b', '\xff', '\x2d', '\x16', '\x04', '\x6a', '\x26', + '\x3f', '\xbd', '\xae', '\x0a', '\x00', '\x38', '\x6a', '\xa6', + '\xff', '\x2d', '\x86', '\x03', '\x41', '\xa2', '\x62', '\xa6', + '\x3f', '\xbd', '\x0a', '\x0a', '\x00', '\x38', '\x62', '\xa6', + '\x4f', '\xbc', '\x90', '\x00', '\x5f', '\xcc', '\x55', '\x05', + '\x3f', '\xbd', '\xc2', '\x09', '\x00', '\x38', '\x6f', '\x1e', + '\x74', '\x09', '\x00', '\x38', '\x62', '\xa6', '\x7b', '\x86', + '\xb1', '\xb9', '\x6a', '\x36', '\x04', '\x21', '\x40', '\xbe', + '\x4b', '\xb4', '\x2b', '\xb6', '\x62', '\xa6', '\xb1', '\xb9', + '\x42', '\x92', '\xc0', '\x9a', '\x1c', '\x20', '\x63', '\xc6', + '\xf0', '\xc3', '\x53', '\x94', '\xe9', '\xc6', '\x14', '\x20', + '\x63', '\x06', '\x6a', '\xd6', '\xf0', '\xd3', '\x5a', '\x94', + '\xe9', '\xd6', '\x0a', '\x20', '\xd0', '\x03', '\x6c', '\x36', + '\x6d', '\xa6', '\x63', '\x06', '\xd0', '\x03', '\x6a', '\x07', + '\x62', '\xa6', '\x4f', '\xbc', '\xf0', '\x00', '\x5f', '\xcc', + '\x55', '\x05', '\x3f', '\xbd', '\xc2', '\x09', '\x00', '\x38', + '\xef', '\x0e', '\xc0', '\x00', '\x1f', '\x00', '\xff', '\x3d', + '\x48', '\x02', '\x0f', '\x05', '\x60', '\x90', '\x0f', '\x05', + '\xef', '\x0e', '\xc4', '\x22', '\x01', '\x00', '\xb0', '\x30', + '\x0f', '\x05', '\x20', '\x90', '\x0f', '\x05', '\xef', '\x0e', + '\x58', '\x22', '\x01', '\x00', '\xff', '\x3d', '\x5a', '\x01', + '\x0f', '\x05', '\xef', '\x0e', '\x5b', '\x22', '\x01', '\x00', + '\xff', '\x3d', '\x4e', '\x01', '\x0f', '\x05', '\xff', '\xed', + '\xb6', '\x02', '\x0f', '\x05', '\xef', '\x0e', '\xda', '\x22', + '\x01', '\x00', '\xff', '\x3d', '\x9c', '\x01', '\x0f', '\x05', + '\x14', '\x90', '\x0f', '\x05', '\xef', '\x0e', '\xd6', '\x22', + '\x01', '\x00', '\xff', '\x3d', '\x8c', '\x01', '\x0f', '\x05', + '\xff', '\xed', '\x94', '\x02', '\x0f', '\x05', '\xef', '\x0e', + '\x49', '\x22', '\x04', '\x00', '\xc4', '\x30', '\x0f', '\x05', + '\xff', '\xed', '\x84', '\x02', '\x0f', '\x05', '\xef', '\x0e', + '\xd7', '\x00', '\x20', '\x00', '\xff', '\x3d', '\x6a', '\x01', + '\x0f', '\x05', '\x20', '\x90', '\x0f', '\x05', '\xef', '\x0e', + '\xc2', '\x00', '\x1f', '\x00', '\xff', '\x3d', '\x00', '\x02', + '\x0f', '\x05', '\xef', '\x0e', '\xc9', '\x00', '\x1f', '\x00', + '\xff', '\x3d', '\x18', '\x02', '\x0f', '\x05', '\xff', '\xed', + '\x56', '\x02', '\x0f', '\x05', '\xef', '\x0e', '\x4f', '\x00', + '\x98', '\x00', '\xff', '\x3d', '\x3c', '\x01', '\x0f', '\x05', + '\x12', '\x90', '\x0f', '\x05', '\xef', '\x0e', '\x43', '\x00', + '\x98', '\x00', '\x76', '\x30', '\x0f', '\x05', '\xff', '\xed', + '\x36', '\x02', '\x0f', '\x05', '\xef', '\x0e', '\xc2', '\x00', + '\x98', '\x00', '\xff', '\x2d', '\x2a', '\x02', '\x0f', '\x05', + '\x6f', '\x1e', '\xa2', '\x18', '\x00', '\x38', '\x61', '\x1a', + '\x6f', '\xde', '\x00', '\x00', '\x20', '\x00', '\x06', '\x21', + '\xed', '\xdb', '\x0c', '\x21', '\x70', '\x8a', '\x6f', '\x9e', + '\x00', '\x00', '\x01', '\x00', '\x10', '\x21', '\xe9', '\x9b', + '\x5f', '\xd2', '\x14', '\x21', '\xed', '\xdb', '\x6f', '\x9e', + '\x00', '\x00', '\x1f', '\x00', '\x18', '\x21', '\xe9', '\x9b', + '\x1f', '\xdc', '\xe1', '\x7f', '\x1c', '\x21', '\xed', '\xdb', + '\x41', '\x92', '\x20', '\x21', '\xe9', '\x9b', '\x6f', '\xde', + '\x00', '\x80', '\x1f', '\x00', '\x24', '\x21', '\xed', '\xdb', + '\x5f', '\xdc', '\x00', '\x20', '\x28', '\x21', '\xed', '\xdb', + '\x42', '\xd2', '\x2c', '\x21', '\xed', '\xdb', '\x6f', '\xde', + '\x00', '\xc0', '\x1f', '\x00', '\xff', '\xed', '\x16', '\x01', + '\x0f', '\x05', '\x6f', '\x1e', '\x9e', '\x18', '\x00', '\x38', + '\x61', '\x1a', '\x6f', '\x9e', '\x00', '\x00', '\x20', '\x00', + '\x06', '\x21', '\xe9', '\x9b', '\x0c', '\x21', '\x70', '\x8a', + '\x5f', '\x9c', '\x00', '\x40', '\x10', '\x21', '\xe9', '\x9b', + '\x41', '\xd2', '\x14', '\x21', '\xed', '\xdb', '\x18', '\x21', + '\xe9', '\x9b', '\x5f', '\x9c', '\x00', '\x20', '\x1c', '\x21', + '\xe9', '\x9b', '\x42', '\x92', '\x20', '\x21', '\xe9', '\x9b', + '\x1f', '\x9c', '\xfe', '\x7f', '\x24', '\x21', '\xe9', '\x9b', + '\x28', '\x21', '\xe9', '\x9b', '\x2c', '\x21', '\xed', '\xdb', + '\x6f', '\x9e', '\x00', '\x00', '\x01', '\x00', '\x30', '\x21', + '\xe9', '\x9b', '\x34', '\x21', '\xe9', '\x9b', '\x58', '\xe0', + '\x5f', '\xd2', '\x6f', '\x1e', '\x96', '\x18', '\x00', '\x38', + '\x61', '\x1a', '\x6f', '\x9e', '\x00', '\x00', '\x10', '\x00', + '\x06', '\x21', '\xe9', '\x9b', '\x0c', '\x21', '\x70', '\x8a', + '\x5f', '\x9c', '\x00', '\x40', '\x10', '\x21', '\xe9', '\x9b', + '\x41', '\xd2', '\x14', '\x21', '\xed', '\xdb', '\x18', '\x21', + '\xe9', '\x9b', '\x5f', '\x9c', '\x00', '\x20', '\x1c', '\x21', + '\xe9', '\x9b', '\x42', '\x92', '\x20', '\x21', '\xe9', '\x9b', + '\x1f', '\x9c', '\xfe', '\x7f', '\x24', '\x21', '\xe9', '\x9b', + '\x28', '\x21', '\xe9', '\x9b', '\x2c', '\x21', '\xed', '\xdb', + '\x6f', '\x9e', '\x00', '\x00', '\x01', '\x00', '\x30', '\x21', + '\xe9', '\x9b', '\x34', '\x21', '\xe9', '\x9b', '\x4f', '\xd2', + '\x38', '\x21', '\xed', '\xdb', '\xff', '\xed', '\x3e', '\x01', + '\x0f', '\x05', '\x6f', '\x1e', '\x9a', '\x18', '\x00', '\x38', + '\x61', '\x1a', '\x6f', '\x9e', '\x00', '\x00', '\x10', '\x00', + '\x06', '\x21', '\xe9', '\x9b', '\x0c', '\x21', '\x70', '\x8a', + '\x6f', '\xde', '\x00', '\x00', '\x01', '\x00', '\x10', '\x21', + '\xed', '\xdb', '\x4f', '\x92', '\x14', '\x21', '\xe9', '\x9b', + '\x6f', '\xde', '\x00', '\x00', '\x0f', '\x00', '\x18', '\x21', + '\xed', '\xdb', '\x1f', '\x9c', '\xf1', '\x7f', '\x1c', '\x21', + '\xe9', '\x9b', '\x41', '\x92', '\x20', '\x21', '\xe9', '\x9b', + '\x6f', '\xde', '\x00', '\x80', '\x0f', '\x00', '\x24', '\x21', + '\xed', '\xdb', '\x5f', '\xdc', '\x00', '\x20', '\x28', '\x21', + '\xed', '\xdb', '\x42', '\xd2', '\x2c', '\x21', '\xed', '\xdb', + '\x6f', '\xde', '\x00', '\xc0', '\x0f', '\x00', '\x30', '\x21', + '\xed', '\xdb', '\x5f', '\xdc', '\x00', '\x40', '\x34', '\x21', + '\xed', '\xdb', '\x38', '\x21', '\xe9', '\x9b', '\xce', '\xe0', + '\x0f', '\x05', '\x6f', '\x1e', '\x9e', '\x18', '\x00', '\x38', + '\x61', '\x1a', '\x6f', '\x9e', '\x00', '\x00', '\x20', '\x00', + '\x06', '\x21', '\xe9', '\x9b', '\x0c', '\x21', '\x70', '\x8a', + '\x5f', '\xdc', '\x00', '\x20', '\x10', '\x21', '\xed', '\xdb', + '\x48', '\x92', '\x14', '\x21', '\xe9', '\x9b', '\x6f', '\x9e', + '\x00', '\x00', '\x01', '\x00', '\x18', '\x21', '\xe9', '\x9b', + '\x1c', '\x21', '\xe9', '\x9b', '\x62', '\xe0', '\x5f', '\xd2', + '\x6f', '\x1e', '\xa2', '\x18', '\x00', '\x38', '\x61', '\x1a', + '\x6f', '\x9e', '\x00', '\x00', '\x20', '\x00', '\x06', '\x21', + '\xe9', '\x9b', '\x0c', '\x21', '\x70', '\x8a', '\x6f', '\xde', + '\x00', '\x00', '\x01', '\x00', '\x10', '\x21', '\xed', '\xdb', + '\x26', '\xe0', '\x5f', '\x92', '\x6f', '\x1e', '\xa6', '\x18', + '\x00', '\x38', '\x61', '\x1a', '\x6f', '\x9e', '\x00', '\x00', + '\x40', '\x00', '\x06', '\x21', '\xe9', '\x9b', '\x0c', '\x21', + '\x70', '\x8a', '\x6f', '\xde', '\x00', '\x00', '\x01', '\x00', + '\x10', '\x21', '\xed', '\xdb', '\x4f', '\x9c', '\x3f', '\x00', + '\x14', '\x21', '\xe9', '\x9b', '\x6f', '\xde', '\x00', '\x00', + '\x1f', '\x00', '\x18', '\x21', '\xed', '\xdb', '\x5f', '\x9c', + '\x00', '\x20', '\x1c', '\x21', '\xe9', '\x9b', '\x48', '\xd2', + '\x20', '\x21', '\xed', '\xdb', '\x30', '\xe0', '\x0f', '\x05', + '\x04', '\x21', '\x49', '\x9a', '\x6f', '\xae', '\xda', '\x17', + '\x00', '\x38', '\xcf', '\x9e', '\x01', '\x00', '\x08', '\x30', + '\x0f', '\x05', '\x6f', '\xae', '\xec', '\x17', '\x00', '\x38', + '\x3f', '\xbd', '\xd2', '\x02', '\x00', '\x38', '\x62', '\xaa', + '\x41', '\xb2', '\x3f', '\xbd', '\x02', '\x03', '\x00', '\x38', + '\x7a', '\x86', '\xbe', '\x3f', '\x3e', '\x0d', '\x6f', '\x3e', + '\xd2', '\x02', '\x00', '\x38', '\x6f', '\xae', '\x04', '\x18', + '\x00', '\x38', '\xb3', '\xb9', '\x04', '\x21', '\x40', '\x9e', + '\xcf', '\x9e', '\x01', '\x00', '\x0c', '\x20', '\x42', '\xd2', + '\x6f', '\xae', '\x0c', '\x18', '\x00', '\x38', '\xb3', '\xb9', + '\x42', '\xd2', '\xc0', '\xda', '\x32', '\x20', '\x47', '\xc2', + '\x06', '\x21', '\x6d', '\x9e', '\xc1', '\x93', '\xed', '\x9b', + '\x62', '\xd6', '\x0c', '\xd1', '\x69', '\x9a', '\xc1', '\x93', + '\x0c', '\xd1', '\xe9', '\x9b', '\x10', '\xd1', '\x69', '\x9a', + '\xc1', '\x93', '\x10', '\xd1', '\xe9', '\x9b', '\x81', '\xc2', + '\xe9', '\x60', '\x0c', '\xd2', '\x6f', '\xae', '\x0e', '\x18', + '\x00', '\x38', '\x3f', '\xbd', '\xd2', '\x02', '\x00', '\x38', + '\x6f', '\x0e', '\xd2', '\x02', '\x00', '\x38', '\x6f', '\xae', + '\x10', '\x18', '\x00', '\x38', '\xb0', '\xb9', '\x61', '\xa6', + '\xb0', '\xb9', '\x6f', '\xae', '\x42', '\x17', '\x00', '\x38', + '\xb0', '\xb9', '\x62', '\xaa', '\x41', '\xb2', '\x3f', '\xbd', + '\x02', '\x03', '\x00', '\x38', '\x41', '\xa2', '\xbe', '\x3f', + '\x3e', '\x0d', '\xfc', '\xe1', '\x7e', '\xbe', '\x8c', '\xe2', + '\xfe', '\x2b', '\x6a', '\x16', '\x6b', '\x26', '\x6f', '\x0e', + '\x0a', '\x0a', '\x00', '\x38', '\xb0', '\xb9', '\x61', '\xa6', + '\x4f', '\xbc', '\x80', '\x00', '\x5f', '\xcc', '\x55', '\x05', + '\x3f', '\xbd', '\xc2', '\x09', '\x00', '\x38', '\x61', '\xa6', + '\xb0', '\xb9', '\x04', '\x11', '\x49', '\x9a', '\xcf', '\x9e', + '\x02', '\x00', '\x10', '\x20', '\x0f', '\x05', '\x6f', '\x9e', + '\x30', '\x00', '\x30', '\x00', '\x61', '\x29', '\xe9', '\x9b', + '\xbe', '\x2f', '\x3e', '\x0d', '\x4f', '\x9c', '\x30', '\x00', + '\x61', '\x29', '\xd9', '\x9b', '\xbe', '\x2f', '\x3e', '\x0d', + '\x84', '\xe2', '\xfe', '\x0b', '\x06', '\xa1', '\xeb', '\xba', + '\x10', '\x10', '\x0f', '\x05', '\x7a', '\x86', '\x7f', '\xb6', + '\xbe', '\x0f', '\x10', '\xa1', '\x6a', '\xaa', '\x7f', '\xb6', + '\xbe', '\x0f', '\x70', '\x86', '\x0c', '\xa1', '\xeb', '\xba', + '\x22', '\x10', '\x7d', '\x86', '\x14', '\xa1', '\xed', '\xda', + '\x10', '\x00', '\x79', '\x86', '\x10', '\xa1', '\x6c', '\xca', + '\x01', '\x92', '\x14', '\xa1', '\xe9', '\x9a', '\xf9', '\x10', + '\x2c', '\xd6', '\x0c', '\xa1', '\x29', '\xda', '\xe9', '\xb6', + '\xd1', '\x10', '\x0f', '\x05', '\x01', '\x02', '\xc7', '\x02', + '\xd3', '\x80', '\x0c', '\xa2', '\x7a', '\x86', '\x7f', '\xb6', + '\xbe', '\x0f', '\x84', '\xe2', '\xfe', '\x0b', '\x6a', '\x06', + '\x6b', '\xa6', '\x6d', '\xb6', '\x7d', '\x86', '\xeb', '\xd6', + '\x48', '\xa0', '\x0f', '\x05', '\x60', '\x9a', '\x2d', '\x96', + '\x49', '\xa5', '\x59', '\x9a', '\x4c', '\xd5', '\xd9', '\x9a', + '\x32', '\x30', '\x02', '\xd2', '\x82', '\xd2', '\x6b', '\x96', + '\x2a', '\x96', '\xe9', '\xa6', '\x20', '\x00', '\x6a', '\xc6', + '\x60', '\xc9', '\x59', '\x9a', '\xdf', '\x9e', '\xff', '\xff', + '\x0a', '\x30', '\x02', '\xc2', '\x82', '\xc2', '\x42', '\xa2', + '\x7f', '\xb6', '\xbe', '\x0f', '\x6b', '\x96', '\x2a', '\x96', + '\xe9', '\xc6', '\xe5', '\x10', '\x0f', '\x05', '\x41', '\xa2', + '\x7f', '\xb6', '\xbe', '\x0f', '\xeb', '\xd6', '\xbd', '\xb0', + '\x0f', '\x05', '\x7a', '\x86', '\x7f', '\xb6', '\xbe', '\x0f', + '\xfc', '\xe1', '\x7e', '\xbe', '\x90', '\xe2', '\xfe', '\x3b', + '\x73', '\x86', '\x72', '\x86', '\x6f', '\x0e', '\xaa', '\x18', + '\x00', '\x38', '\x41', '\x12', '\x04', '\x01', '\xc1', '\x1b', + '\xcf', '\x1e', '\x01', '\x00', '\x04', '\x30', '\x42', '\x92', + '\x44', '\x92', '\x05', '\x01', '\xc9', '\x9b', '\x60', '\xa6', + '\x3f', '\xbd', '\x9e', '\x0c', '\x00', '\x38', '\x6a', '\xa6', + '\x0c', '\x20', '\x0f', '\x05', '\xc1', '\x13', '\xcf', '\x1e', + '\x03', '\x00', '\xd9', '\x80', '\x0f', '\x05', '\x06', '\x01', + '\x23', '\x3a', '\x0f', '\x0c', '\x6c', '\x00', '\x01', '\x22', + '\xc1', '\x22', '\xc7', '\x80', '\x63', '\xa6', '\xbe', '\x3f', + '\x3e', '\x0d', '\xfc', '\xe1', '\x7e', '\xbe', '\x98', '\xe2', + '\xfe', '\x5b', '\x6a', '\x16', '\x6b', '\x56', '\x6c', '\x36', + '\x70', '\x86', '\xed', '\x06', '\x74', '\xa0', '\x6d', '\x46', + '\x05', '\x11', '\x49', '\x9a', '\xcf', '\x9e', '\x02', '\x00', + '\x12', '\x20', '\x0f', '\x05', '\x43', '\x05', '\x59', '\x9a', + '\xdf', '\x9e', '\xff', '\xff', '\x54', '\x30', '\x42', '\x22', + '\x05', '\x11', '\x49', '\x9a', '\xcf', '\x9e', '\x04', '\x00', + '\x0e', '\x20', '\x61', '\xa6', '\x43', '\x05', '\x69', '\x9a', + '\xff', '\x92', '\x3e', '\x30', '\x44', '\x22', '\x61', '\xa6', + '\x3f', '\xbd', '\x0a', '\x0a', '\x00', '\x38', '\x61', '\xa6', + '\x4f', '\xbc', '\xa0', '\x00', '\x5f', '\xcc', '\x55', '\x05', + '\x3f', '\xbd', '\xc2', '\x09', '\x00', '\x38', '\x65', '\xb6', + '\x20', '\xb6', '\x63', '\xc6', '\x20', '\xc6', '\x61', '\xa6', + '\x3f', '\xbd', '\x96', '\x09', '\x00', '\x38', '\x6a', '\x26', + '\x61', '\xa6', '\x65', '\xb6', '\x20', '\xb6', '\x3f', '\xbd', + '\x36', '\x0a', '\x00', '\x38', '\x6a', '\xa6', '\xf3', '\x20', + '\x61', '\xa6', '\x22', '\x06', '\xe4', '\x06', '\x91', '\xb0', + '\x0f', '\x05', '\xbe', '\x5f', '\x3e', '\x0d', '\xfc', '\xe1', + '\x7e', '\xbe', '\xa4', '\xe2', '\xfe', '\x8b', '\x6a', '\x16', + '\x6b', '\x06', '\x6c', '\x86', '\x3f', '\xbd', '\xc8', '\x11', + '\x00', '\x38', '\x6a', '\x96', '\x1a', '\x30', '\x41', '\xa2', + '\x60', '\xd6', '\x28', '\xd6', '\xe9', '\xd6', '\x14', '\x80', + '\x0f', '\x05', '\x6f', '\xae', '\x14', '\x18', '\x00', '\x38', + '\x3f', '\xbd', '\xd2', '\x02', '\x00', '\x38', '\x42', '\xa2', + '\xbe', '\x8f', '\x3e', '\x0d', '\x6f', '\xce', '\xb0', '\x18', + '\x00', '\x38', '\x6c', '\xca', '\xec', '\x06', '\x1e', '\x10', + '\xec', '\xd6', '\x6f', '\x9e', '\x82', '\x19', '\x00', '\x38', + '\x09', '\x91', '\x70', '\x8a', '\x16', '\x91', '\xe1', '\x1b', + '\xac', '\x06', '\x1a', '\x91', '\xe0', '\x0b', '\x1e', '\x91', + '\xe8', '\x8b', '\x74', '\xe0', '\x0f', '\x05', '\x5a', '\x80', + '\x6c', '\x96', '\x6f', '\xde', '\x82', '\x19', '\x00', '\x38', + '\x01', '\xd1', '\xe1', '\x1b', '\x05', '\xd1', '\xe0', '\x0b', + '\xa0', '\x96', '\x09', '\xd1', '\xe9', '\x9b', '\x29', '\x16', + '\x16', '\xd1', '\xe1', '\x1b', '\x1a', '\xd1', '\x70', '\x8a', + '\x68', '\xc6', '\xa9', '\xc6', '\x1e', '\xd1', '\xec', '\xcb', + '\x46', '\xe0', '\x0f', '\x05', '\x6f', '\xae', '\x30', '\x18', + '\x00', '\x38', '\x3f', '\xbd', '\xd2', '\x02', '\x00', '\x38', + '\x44', '\xa2', '\xbe', '\x8f', '\x3e', '\x0d', '\x6f', '\xae', + '\x44', '\x18', '\x00', '\x38', '\x3f', '\xbd', '\xd2', '\x02', + '\x00', '\x38', '\x60', '\xa6', '\x41', '\xb2', '\x3f', '\xbd', + '\x02', '\x03', '\x00', '\x38', '\x43', '\xa2', '\xbe', '\x8f', + '\x3e', '\x0d', '\x6f', '\x9e', '\x82', '\x19', '\x00', '\x38', + '\x01', '\x91', '\xe1', '\x1b', '\x05', '\x91', '\xe0', '\x0b', + '\x09', '\x91', '\xe8', '\x8b', '\x1e', '\x91', '\x70', '\x8a', + '\x6f', '\xce', '\x82', '\x19', '\x00', '\x38', '\x7c', '\x0a', + '\x0d', '\xc1', '\x70', '\x8a', '\x11', '\xc1', '\x70', '\x8a', + '\x15', '\xc1', '\x79', '\x0e', '\x7f', '\x0d', '\xa4', '\x19', + '\x00', '\x38', '\x70', '\x8a', '\x7f', '\x0d', '\xa8', '\x19', + '\x00', '\x38', '\x70', '\x8a', '\x0d', '\x91', '\xe8', '\x8a', + '\xff', '\x8d', '\xc0', '\x01', '\x75', '\x86', '\x65', '\x56', + '\x04', '\x20', '\x6c', '\xd6', '\x15', '\xd2', '\x65', '\x96', + '\x29', '\x55', '\x65', '\x36', '\x23', '\x95', '\x09', '\xd1', + '\x69', '\x9a', '\x24', '\x30', '\x2c', '\x36', '\x0d', '\xd1', + '\xe9', '\x9a', '\x1c', '\x80', '\x0f', '\x05', '\x09', '\x31', + '\x69', '\x9a', '\x10', '\x30', '\x0f', '\x05', '\x83', '\x0b', + '\x0a', '\x20', '\x0f', '\x05', '\x0d', '\x31', '\xe9', '\x9a', + '\x06', '\x20', '\x0f', '\x05', '\x65', '\x56', '\x35', '\x35', + '\x11', '\x31', '\x63', '\x3a', '\xca', '\x32', '\x4d', '\x90', + '\x65', '\x96', '\x29', '\x55', '\x65', '\x36', '\x23', '\x95', + '\x2f', '\x3e', '\x82', '\x19', '\x00', '\x38', '\x05', '\x31', + '\x64', '\x4a', '\x0d', '\x31', '\x69', '\x9a', '\x29', '\x46', + '\x01', '\x31', '\x27', '\x9a', '\x65', '\xa6', '\xc3', '\xa3', + '\xa5', '\xa6', '\xc2', '\xa3', '\xa5', '\xa6', '\xc2', '\xa3', + '\x2f', '\xae', '\xaa', '\x18', '\x00', '\x38', '\x64', '\xb6', + '\x3f', '\xbd', '\x18', '\x11', '\x00', '\x38', '\x83', '\x0b', + '\x24', '\x30', '\x6a', '\x66', '\x65', '\xa6', '\xc3', '\xa3', + '\xa5', '\xa6', '\xc2', '\xa3', '\xa5', '\xa6', '\xc2', '\xa3', + '\x2f', '\xae', '\xaa', '\x18', '\x00', '\x38', '\x64', '\xb6', + '\x3f', '\xbd', '\x36', '\x0a', '\x00', '\x38', '\x6a', '\xa6', + '\xe5', '\x20', '\x65', '\xa6', '\x73', '\x0a', '\x65', '\x26', + '\xc3', '\x23', '\xa5', '\x26', '\xc2', '\x23', '\xa5', '\x26', + '\xc2', '\x23', '\x2f', '\x2e', '\xaa', '\x18', '\x00', '\x38', + '\x62', '\xa6', '\x4f', '\xbc', '\xf0', '\x00', '\x5f', '\xcc', + '\x55', '\x05', '\x3f', '\xbd', '\xc2', '\x09', '\x00', '\x38', + '\x62', '\xa6', '\x64', '\xb6', '\x67', '\xc6', '\x66', '\xd6', + '\x3f', '\xbd', '\x6a', '\x11', '\x00', '\x38', '\x4a', '\xa6', + '\x28', '\x20', '\x7b', '\x86', '\x0d', '\x31', '\x69', '\xde', + '\x26', '\xd6', '\xe9', '\xdb', '\x11', '\x31', '\x70', '\x8a', + '\x62', '\xaa', '\x24', '\xa6', '\x3f', '\xbd', '\x02', '\x03', + '\x00', '\x38', '\x6f', '\xae', '\x4e', '\x18', '\x00', '\x38', + '\x3f', '\xbd', '\xd2', '\x02', '\x00', '\x38', '\xaa', '\xe0', + '\x0f', '\x05', '\xcf', '\xae', '\x01', '\x00', '\x4c', '\x30', + '\x0f', '\x05', '\xcf', '\xae', '\x02', '\x00', '\x46', '\x20', + '\x65', '\xa6', '\x62', '\xaa', '\x24', '\xa6', '\x6f', '\x1e', + '\x02', '\x03', '\x00', '\x38', '\x7b', '\x86', '\xb1', '\xb9', + '\x6f', '\x0e', '\xd2', '\x02', '\x00', '\x38', '\x6f', '\xae', + '\x62', '\x18', '\x00', '\x38', '\xb0', '\xb9', '\x66', '\xa6', + '\x7b', '\x86', '\xb1', '\xb9', '\x6f', '\xae', '\x6e', '\x18', + '\x00', '\x38', '\xb0', '\xb9', '\x62', '\xa6', '\x64', '\xb6', + '\x3f', '\xbd', '\xca', '\x10', '\x00', '\x38', '\x41', '\x92', + '\xc3', '\x9b', '\x11', '\x31', '\x6d', '\x9e', '\x01', '\x92', + '\x58', '\xe0', '\xed', '\x9b', '\x65', '\xa6', '\xc3', '\xa3', + '\xa5', '\xa6', '\xc2', '\xa3', '\xa5', '\xa6', '\xc2', '\xa3', + '\x6f', '\xad', '\xaa', '\x18', '\x00', '\x38', '\x62', '\xae', + '\x24', '\xa6', '\x6f', '\x1e', '\x02', '\x03', '\x00', '\x38', + '\x7b', '\x86', '\xb1', '\xb9', '\x6f', '\x0e', '\xd2', '\x02', + '\x00', '\x38', '\x6f', '\xae', '\x76', '\x18', '\x00', '\x38', + '\xb0', '\xb9', '\x66', '\xa6', '\x7b', '\x86', '\xb1', '\xb9', + '\x6f', '\xae', '\x6e', '\x18', '\x00', '\x38', '\xb0', '\xb9', + '\x62', '\xa6', '\x64', '\xb6', '\x67', '\xc6', '\x66', '\xd6', + '\x3f', '\xbd', '\x1a', '\x12', '\x00', '\x38', '\x0d', '\x31', + '\x6d', '\x9e', '\x26', '\x96', '\xed', '\x9b', '\x11', '\x31', + '\x70', '\x8a', '\x6f', '\xce', '\x82', '\x19', '\x00', '\x38', + '\x0d', '\xc1', '\x69', '\x9a', '\x7f', '\x0d', '\xa4', '\x19', + '\x00', '\x38', '\x29', '\x9a', '\xe8', '\x96', '\xff', '\x1d', + '\x44', '\xfe', '\x0f', '\x05', '\x75', '\x86', '\x6f', '\x2e', + '\xaa', '\x18', '\x00', '\x38', '\x6f', '\x1e', '\x82', '\x19', + '\x00', '\x38', '\x09', '\x11', '\xa0', '\x0b', '\x4c', '\x30', + '\x7b', '\x86', '\x62', '\xaa', '\x3f', '\xbd', '\x02', '\x03', + '\x00', '\x38', '\x6f', '\xae', '\x82', '\x18', '\x00', '\x38', + '\x3f', '\xbd', '\xd2', '\x02', '\x00', '\x38', '\x70', '\x86', + '\x09', '\x11', '\xe0', '\x0a', '\x22', '\x00', '\x0f', '\x05', + '\x05', '\x11', '\x29', '\x0a', '\x01', '\x11', '\x6d', '\xda', + '\x62', '\x99', '\x59', '\x9a', '\x4d', '\x05', '\xd9', '\x9a', + '\xff', '\x2d', '\x9a', '\xfd', '\x0f', '\x05', '\x02', '\x02', + '\x09', '\x11', '\xe0', '\x0a', '\xe3', '\x10', '\x0f', '\x05', + '\x6f', '\xae', '\x92', '\x18', '\x00', '\x38', '\x3f', '\xbd', + '\xd2', '\x02', '\x00', '\x38', '\x0f', '\x2c', '\x6c', '\x00', + '\x01', '\x52', '\xc1', '\x52', '\xa5', '\x80', '\x15', '\x12', + '\x7a', '\x86', '\xbe', '\x8f', '\x3e', '\x0d', '\x00', '\x00', + '\x7f', '\xb6', '\x0f', '\x05', '\x00', '\x00', '\x00', '\x00', + '\x0d', '\x0a', '\x0d', '\x0a', '\x44', '\x65', '\x76', '\x69', + '\x63', '\x65', '\x20', '\x49', '\x44', '\x20', '\x3d', '\x20', + '\x00', '\x00', '\x43', '\x68', '\x65', '\x63', '\x6b', '\x73', + '\x75', '\x6d', '\x20', '\x6f', '\x66', '\x20', '\x62', '\x6f', + '\x6f', '\x74', '\x6c', '\x6f', '\x61', '\x64', '\x65', '\x72', + '\x20', '\x69', '\x73', '\x20', '\x00', '\x00', '\x57', '\x61', + '\x69', '\x74', '\x69', '\x6e', '\x67', '\x20', '\x66', '\x6f', + '\x72', '\x20', '\x6c', '\x6f', '\x61', '\x64', '\x20', '\x69', + '\x6e', '\x66', '\x6f', '\x2e', '\x0d', '\x0a', '\x00', '\x00', + '\x47', '\x6f', '\x74', '\x20', '\x6c', '\x6f', '\x61', '\x64', + '\x20', '\x69', '\x6e', '\x66', '\x6f', '\x2e', '\x0d', '\x0a', + '\x00', '\x00', '\x50', '\x41', '\x43', '\x4b', '\x45', '\x54', + '\x5f', '\x49', '\x4e', '\x46', '\x4f', '\x0d', '\x0a', '\x00', + '\x53', '\x45', '\x54', '\x5f', '\x52', '\x45', '\x47', '\x49', + '\x53', '\x54', '\x45', '\x52', '\x0d', '\x0a', '\x00', '\x00', + '\x47', '\x45', '\x54', '\x5f', '\x52', '\x45', '\x47', '\x49', + '\x53', '\x54', '\x45', '\x52', '\x0d', '\x0a', '\x00', '\x00', + '\x50', '\x41', '\x55', '\x53', '\x45', '\x5f', '\x4c', '\x4f', + '\x4f', '\x50', '\x0d', '\x0a', '\x00', '\x00', '\x4d', '\x45', + '\x4d', '\x5f', '\x56', '\x45', '\x52', '\x49', '\x46', '\x59', + '\x0d', '\x0a', '\x00', '\x00', '\x76', '\x65', '\x72', '\x69', + '\x66', '\x79', '\x20', '\x66', '\x61', '\x69', '\x6c', '\x65', + '\x64', '\x0d', '\x0a', '\x00', '\x4d', '\x45', '\x4d', '\x5f', + '\x54', '\x45', '\x53', '\x54', '\x0d', '\x0a', '\x00', '\x00', + '\x23', '\x23', '\x23', '\x20', '\x4d', '\x65', '\x6d', '\x6f', + '\x72', '\x79', '\x20', '\x74', '\x65', '\x73', '\x74', '\x20', + '\x66', '\x61', '\x69', '\x6c', '\x65', '\x64', '\x20', '\x61', + '\x74', '\x20', '\x00', '\x00', '\x50', '\x61', '\x73', '\x73', + '\x65', '\x64', '\x20', '\x6d', '\x65', '\x6d', '\x6f', '\x72', + '\x79', '\x20', '\x74', '\x65', '\x73', '\x74', '\x2e', '\x0d', + '\x0a', '\x00', '\x4d', '\x45', '\x4d', '\x5f', '\x44', '\x55', + '\x4d', '\x50', '\x0d', '\x0a', '\x00', '\x00', '\x4d', '\x45', + '\x4d', '\x5f', '\x43', '\x4c', '\x45', '\x41', '\x52', '\x0d', + '\x0a', '\x00', '\x46', '\x4c', '\x41', '\x53', '\x48', '\x0d', + '\x0a', '\x00', '\x4a', '\x55', '\x4d', '\x50', '\x0d', '\x0a', + '\x00', '\x00', '\x45', '\x4e', '\x44', '\x0d', '\x0a', '\x00', + '\x23', '\x23', '\x23', '\x20', '\x55', '\x6e', '\x6b', '\x6e', + '\x6f', '\x77', '\x6e', '\x20', '\x74', '\x79', '\x70', '\x65', + '\x3a', '\x20', '\x00', '\x00', '\x43', '\x68', '\x65', '\x63', + '\x6b', '\x73', '\x75', '\x6d', '\x20', '\x6f', '\x66', '\x20', + '\x66', '\x69', '\x6c', '\x65', '\x20', '\x69', '\x73', '\x20', + '\x00', '\x00', '\x23', '\x23', '\x23', '\x20', '\x4d', '\x65', + '\x6d', '\x6f', '\x72', '\x79', '\x20', '\x74', '\x65', '\x73', + '\x74', '\x20', '\x31', '\x20', '\x66', '\x61', '\x69', '\x6c', + '\x65', '\x64', '\x20', '\x61', '\x74', '\x20', '\x00', '\x00', + '\x23', '\x23', '\x23', '\x20', '\x4d', '\x65', '\x6d', '\x6f', + '\x72', '\x79', '\x20', '\x74', '\x65', '\x73', '\x74', '\x20', + '\x32', '\x20', '\x66', '\x61', '\x69', '\x6c', '\x65', '\x64', + '\x20', '\x61', '\x74', '\x20', '\x00', '\x00', '\x20', '\x3a', + '\x00', '\x00', '\x38', '\x4d', '\x62', '\x20', '\x42', '\x42', + '\x00', '\x00', '\x38', '\x4d', '\x62', '\x20', '\x54', '\x42', + '\x00', '\x00', '\x31', '\x36', '\x4d', '\x62', '\x20', '\x42', + '\x42', '\x00', '\x31', '\x36', '\x4d', '\x62', '\x20', '\x54', + '\x42', '\x00', '\x33', '\x32', '\x4d', '\x62', '\x20', '\x54', + '\x42', '\x00', '\x55', '\x6e', '\x73', '\x75', '\x70', '\x70', + '\x6f', '\x72', '\x74', '\x65', '\x64', '\x20', '\x69', '\x6e', + '\x74', '\x65', '\x72', '\x6c', '\x65', '\x61', '\x76', '\x65', + '\x21', '\x0a', '\x00', '\x00', '\x46', '\x6f', '\x75', '\x6e', + '\x64', '\x20', '\x31', '\x20', '\x78', '\x20', '\x43', '\x46', + '\x49', '\x20', '\x61', '\x74', '\x20', '\x00', '\x54', '\x6f', + '\x6f', '\x20', '\x6d', '\x61', '\x6e', '\x79', '\x20', '\x72', + '\x65', '\x67', '\x69', '\x6f', '\x6e', '\x73', '\x20', '\x6f', + '\x6e', '\x20', '\x63', '\x68', '\x69', '\x70', '\x21', '\x0a', + '\x00', '\x00', '\x4e', '\x6f', '\x20', '\x73', '\x69', '\x6e', + '\x67', '\x6c', '\x65', '\x20', '\x78', '\x31', '\x36', '\x20', + '\x61', '\x74', '\x20', '\x00', '\x4e', '\x6f', '\x20', '\x69', + '\x6e', '\x74', '\x65', '\x72', '\x6c', '\x65', '\x61', '\x76', + '\x65', '\x64', '\x20', '\x78', '\x31', '\x36', '\x20', '\x61', + '\x74', '\x20', '\x00', '\x00', '\x46', '\x6f', '\x75', '\x6e', + '\x64', '\x20', '\x00', '\x00', '\x31', '\x00', '\x32', '\x00', + '\x20', '\x78', '\x20', '\x00', '\x46', '\x61', '\x74', '\x61', + '\x6c', '\x3a', '\x20', '\x66', '\x6c', '\x61', '\x73', '\x68', + '\x20', '\x69', '\x73', '\x20', '\x74', '\x6f', '\x6f', '\x20', + '\x73', '\x6d', '\x61', '\x6c', '\x6c', '\x2e', '\x0a', '\x00', + '\x53', '\x65', '\x63', '\x74', '\x6f', '\x72', '\x20', '\x65', + '\x72', '\x61', '\x73', '\x65', '\x20', '\x65', '\x72', '\x72', + '\x6f', '\x72', '\x0a', '\x00', '\x45', '\x72', '\x72', '\x6f', + '\x72', '\x20', '\x61', '\x74', '\x20', '\x00', '\x3a', '\x20', + '\x4e', '\x6f', '\x20', '\x6e', '\x65', '\x65', '\x64', '\x20', + '\x74', '\x6f', '\x20', '\x77', '\x72', '\x69', '\x74', '\x65', + '\x0a', '\x00', '\x3a', '\x20', '\x45', '\x72', '\x61', '\x73', + '\x69', '\x6e', '\x67', '\x20', '\x00', '\x00', '\x20', '\x62', + '\x79', '\x74', '\x65', '\x73', '\x0a', '\x00', '\x3a', '\x20', + '\x57', '\x72', '\x69', '\x74', '\x69', '\x6e', '\x67', '\x20', + '\x00', '\x00', '\x3a', '\x20', '\x56', '\x65', '\x72', '\x69', + '\x66', '\x79', '\x69', '\x6e', '\x67', '\x2e', '\x2e', '\x2e', + '\x00', '\x00', '\x4f', '\x4b', '\x0a', '\x00', '\x6a', '\x17', + '\x00', '\x38', '\x72', '\x17', '\x00', '\x38', '\x7a', '\x17', + '\x00', '\x38', '\x82', '\x17', '\x00', '\x38', '\x8a', '\x17', + '\x00', '\x38', '\x00', '\x00', '\x00', '\x80', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x84', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', '\x00', + '\x00', '\x00', '\x00', '\x00', '\x54', '\x68', '\x69', '\x73', + '\x20', '\x62', '\x6f', '\x6f', '\x74', '\x6c', '\x6f', '\x61', + '\x64', '\x65', '\x72', '\x20', '\x77', '\x61', '\x73', '\x20', + '\x62', '\x75', '\x69', '\x6c', '\x74', '\x20', '\x62', '\x79', + '\x20', '\x72', '\x6f', '\x6f', '\x74', '\x20', '\x6f', '\x6e', + '\x20', '\x57', '\x65', '\x64', '\x20', '\x4d', '\x61', '\x79', + '\x20', '\x31', '\x36', '\x20', '\x32', '\x31', '\x3a', '\x33', + '\x31', '\x3a', '\x34', '\x36', '\x20', '\x43', '\x45', '\x53', + '\x54', '\x20', '\x32', '\x30', '\x30', '\x37', '\x2e', '\x0d', + '\x0a', '\x00' +}; diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/serial.c b/target/linux/etrax-2.6/image/e100boot/src/sbl/serial.c new file mode 100644 index 0000000000..95a02299e1 --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/serial.c @@ -0,0 +1,637 @@ +/*!*************************************************************************** +*! +*! FILE NAME : serial.c +*! +*! DESCRIPTION: Serial boot stuff for e100boot. +*! +*! --------------------------------------------------------------------------- +*! HISTORY +*! +*! DATE NAME CHANGES +*! ---- ---- ------- +*! 1996 Ronny Raneup Initial version +*! 2002 05 02 Ronny Ranerup Moved it into this file +*! --------------------------------------------------------------------------- +*! (C) Copyright 1999-2003 Axis Communications AB, LUND, SWEDEN +*!***************************************************************************/ + +/************************** Include files ********************************/ + +#include +#include +#include +#include + +/************************** Type definitions *****************************/ + +/************************** Global variables *****************************/ + +FILE *serialFd; +int set_baudrate = 9600; /* Baudrate for serial boot (after bootloader). */ + +/************************** Constants and macros *************************/ + +/************************** Function prototypes **************************/ + +int SetControlMode(FILE *fd, int value, int onoff); +int SetInputMode(FILE *fd, int value, int onoff); +int SetLocalMode(FILE *fd, int value, int onoff); +int SetOutputMode(FILE *fd, int value, int onoff); +int WaitForRead(int s, int usecs); +int WaitForWrite(int s, int usecs); +void setBaudRate(unsigned int b); + +/**************************************************************************** +*# +*# FUNCTION NAME: SerBoot +*# +*# DESCRIPTION: The main serial boot routine. +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 2000 01 07 ronny Initial version +*# +*#***************************************************************************/ + +void +SerBoot(void) +{ + int seq = 0; + struct packet_buf *p; + int got_new_ack = 0; + int connected = 0; + char rec_buf; + + while ((p = create_packet(seq))) { + int offset = 0; + int tr_len = 0; + static char fName[MAX_STRING_LEN] = {0,}; + + if (strcmp(fName, p->boot_file->fileName) != 0) { + while (connected && got_new_ack == 0) { + WaitForRead(fileno(serialFd), 1000000); /* Did we get data? */ + + if(fread(&rec_buf, 1, 1, serialFd) > 0) { + fwrite(&rec_buf, 1, 1, stderr); + if (rec_buf == '+') { + printf("# Got ack.\n"); + got_new_ack = 1; + } + } + } + + strcpy(fName, p->boot_file->fileName); + printf("# transmitting file '%s'\n", fName); + got_new_ack = 0; + } + + printf("# transmitting %d bytes at baudrate %d.\n", (int)p->size, p->baud_rate); + + // setBaudRate(p->baud_rate); + + while (tr_len != p->size) { + + if (WaitForRead(fileno(serialFd), 0)) { /* Did we get data? */ + // static int connected = 0; + char rec_buf = 0; + int rec_len = 0; + + if((rec_len = fread(&rec_buf, 1, 1, serialFd)) > 0) { + if (rec_buf == '+') { + if (!connected++) { + printf("# Got ack.\n"); + } + else { + got_new_ack = 1; + printf("# Got ack.\n"); + } + fwrite(&rec_buf, rec_len, 1, stderr); + } + } + } + + if (tr_len < p->size) { /* send one byte */ + while (!(WaitForWrite(fileno(serialFd), 1000000))) { } + fwrite(&p->data[offset+tr_len], 1, 1, serialFd); + tr_len++; + } + } + + seq++; /* We have transmitted entire packet. */ + } + + printf("# Transmission done. Just listening now.\n"); + + while(1) { + if (WaitForRead(fileno(serialFd), 10000000)) { /* Did we get data? */ + char rec_buf; + int rec_len = 0; + + if((rec_len = fread(&rec_buf, 1, 1, serialFd)) > 0) { + fwrite(&rec_buf, rec_len, 1, stderr); + } + } + } +} + +/**************************************************************************** +*# +*# FUNCTION NAME: SetupSerial +*# +*# PARAMETERS: +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 970325 ronny Initial version +*# +*#***************************************************************************/ + +int +SetupSerial(void) +{ + int baudRates[] = {0, 50, 75, 110, 134, 150, 200, 300, 600, + 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200}; + struct termios ti; + int baudrate; + + if ((serialFd = fopen(device, "r+")) == NULL) { + perror("Can't open modem"); + return FALSE; + } + + /* Important. Remember this!!!!!!! */ + /* setvbuf(serialFd, NULL, _IONBF, 0); */ + + setvbuf(serialFd, NULL, _IONBF, 0); + setvbuf(stdout, NULL, _IONBF, 0); + + if (fcntl(fileno(serialFd), F_SETFL, O_NONBLOCK) == -1) { + perror("fcntl"); + return FALSE; + } + + tcflush(fileno(serialFd), TCIOFLUSH); + + if (tcgetattr(fileno(serialFd), &ti)) { + perror("tcgetattr"); + return FALSE; + } + + ti.c_cc[VMIN] = 1; + ti.c_cc[VTIME] = 0; + ti.c_cc[VSTART] = 0x11; + ti.c_cc[VSTOP] = 0x13; + + if (tcsetattr(fileno(serialFd), TCSANOW, &ti)) { + perror("tcsetattr"); + return FALSE; + } + + //if (db3) printf("outspeed: %d, inspeed: %d\n", baudRates[cfgetospeed(&ti)], baudRates[cfgetispeed(&ti)]); + { + int new_baudrate = 0; + + if (set_baudrate <= 50) { + baudrate = B50; + new_baudrate = 50; + } + else if (set_baudrate <= 75) { + baudrate = B75; + new_baudrate = 75; + } + else if (set_baudrate <= 110) { + baudrate = B110; + new_baudrate = 110; + } + else if (set_baudrate <= 134) { + baudrate = B134; + new_baudrate = 134; + } + else if (set_baudrate <= 150) { + baudrate = B150; + new_baudrate = 150; + } + else if (set_baudrate <= 200) { + baudrate = B200; + new_baudrate = 200; + } + else if (set_baudrate <= 300) { + baudrate = B300; + new_baudrate = 300; + } + else if (set_baudrate <= 600) { + baudrate = B600; + new_baudrate = 600; + } + else if (set_baudrate <= 1200) { + baudrate = B1200; + new_baudrate = 1200; + } + else if (set_baudrate <= 1800) { + baudrate = B1800; + new_baudrate = 1800; + } + else if (set_baudrate <= 2400) { + baudrate = B2400; + new_baudrate = 2400; + } + else if (set_baudrate <= 4800) { + baudrate = B4800; + new_baudrate = 4800; + } + else if (set_baudrate <= 9600) { + baudrate = B9600; + new_baudrate = 9600; + } + else if (set_baudrate <= 19200) { + baudrate = B19200; + new_baudrate = 19200; + } + else if (set_baudrate <= 38400) + baudrate = B38400; +#if defined(B57600) /* POSIX only defines <= 38400 */ + else if (set_baudrate <= 57600) { + baudrate = B57600; + new_baudrate = 57600; + } +#endif +#if defined(B115200) + else if (set_baudrate <= 115200) { + baudrate = B115200; + new_baudrate = 115200; + } +#endif +#if defined(B230400) + else if (set_baudrate <= 230400) { + baudrate = B230400; + new_baudrate = 230400; + } +#endif + else { + baudrate = B38400; + } + + cfsetispeed(&ti, B9600); + cfsetospeed(&ti, baudrate); + tcsetattr(fileno(serialFd), TCSANOW, &ti); + + // printf("* baudrate set to %d\n", new_baudrate); + set_baudrate = new_baudrate; + + if (db3) printf("outspeed: %d, inspeed: %d\n", baudRates[cfgetospeed(&ti)], baudRates[cfgetispeed(&ti)]); + } + + cfmakeraw(&ti); + + SetInputMode(serialFd, IXON, FALSE); + SetInputMode(serialFd, IXOFF, FALSE); + SetInputMode(serialFd, IXANY, FALSE); + SetInputMode(serialFd, ICRNL, FALSE); + SetInputMode(serialFd, IGNPAR, TRUE); + SetInputMode(serialFd, IGNBRK, TRUE); + SetInputMode(serialFd, IGNPAR, TRUE); + SetInputMode(serialFd, INPCK, FALSE); + + SetOutputMode(serialFd, OPOST, FALSE); + SetOutputMode(serialFd, ONLCR, FALSE); +#ifdef OXTABS + SetOutputMode(serialFd, OXTABS, FALSE); +#endif + +#ifdef ENOEOT + SetOutputMode(serialFd, ENOEOT, FALSE); +#endif + + SetLocalMode(serialFd, ECHO, FALSE); + SetLocalMode(serialFd, ISIG, FALSE); + + SetLocalMode(serialFd, ICANON, FALSE); + + SetControlMode(serialFd, PARENB, FALSE); + SetControlMode(serialFd, CLOCAL, TRUE); + SetControlMode(serialFd, CREAD, TRUE); + + /* Disable hardware flow control. */ +#if defined(CRTSCTS) + + SetControlMode(serialFd, CRTSCTS, FALSE); +#if defined(CRTSXOFF) + SetControlMode(serialFd, CRTSXOFF, FALSE); +#endif + +#elif defined(CCTS_OFLOW) + + SetControlMode(serialFd, CCTS_OFLOW, FALSE); + SetControlMode(serialFd, CRTS_IFLOW, FALSE); + +#elif defined(CNEW_RTSCTS) + + SetControlMode(serialFd, CNEW_RTSCTS, FALSE); + +#else + printf("Cannot set hardware flow control. Set it manually with a terminal program.\n"); +#endif + + return TRUE; +} + +void +setBaudRate(unsigned int b) +{ + int baudRates[] = {0, 50, 75, 110, 134, 150, 200, 300, 600, + 1200, 1800, 2400, 4800, 9600, 19200, 38400, 57600, 115200}; + struct termios ti; + + if (tcgetattr(fileno(serialFd), &ti)) { + perror("tcgetattr"); + exit(EXIT_FAILURE); + } +} + +/**************************************************************************** +*# +*# FUNCTION NAME: SetInputMode +*# +*# PARAMETERS: +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 970325 ronny Initial version +*# +*#***************************************************************************/ + +int +SetInputMode(FILE *fd, int value, int onoff) +{ + struct termios settings; + int result; + + result = tcgetattr(fileno(fd), &settings); + if (result < 0) + { + perror("error in tcgetattr"); + return FALSE; + } + + if (onoff) + settings.c_iflag |= value; + else + settings.c_iflag &= ~value; + + result = tcsetattr(fileno(fd), TCSANOW, &settings); + if (result < 0) + { + perror("error in tcgetattr"); + return FALSE; + } + + return 1; +} + +/**************************************************************************** +*# +*# FUNCTION NAME: SetOutputMode +*# +*# PARAMETERS: +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 2001 May 16 ronny Initial version +*# +*#***************************************************************************/ + +int +SetOutputMode(FILE *fd, int value, int onoff) +{ + struct termios settings; + int result; + + result = tcgetattr(fileno(fd), &settings); + if (result < 0) + { + perror("error in tcgetattr"); + return FALSE; + } + + if (onoff) + settings.c_oflag |= value; + else + settings.c_oflag &= ~value; + + result = tcsetattr(fileno(fd), TCSANOW, &settings); + if (result < 0) + { + perror("error in tcgetattr"); + return FALSE; + } + + return 1; +} + +/**************************************************************************** +*# +*# FUNCTION NAME: SetControlMode +*# +*# PARAMETERS: +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 970325 ronny Initial version +*# +*#***************************************************************************/ + +int +SetControlMode(FILE *fd, int value, int onoff) +{ +#if !defined(_WIN32) + struct termios settings; + int result; + + result = tcgetattr(fileno(fd), &settings); + if (result < 0) + { + perror("error in tcgetattr"); + return FALSE; + } + + if (onoff) + settings.c_cflag |= value; + else + settings.c_cflag &= ~value; + + result = tcsetattr(fileno(fd), TCSANOW, &settings); + if (result < 0) + { + perror("error in tcgetattr"); + return FALSE; + } +#endif + + return TRUE; +} +/**************************************************************************** +*# +*# FUNCTION NAME: SetLocalMode +*# +*# PARAMETERS: +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 970325 ronny Initial version +*# +*#***************************************************************************/ + +int +SetLocalMode(FILE *fd, int value, int onoff) +{ +#if !defined(_WIN32) + struct termios settings; + int result; + + result = tcgetattr(fileno(fd), &settings); + if (result < 0) + { + perror("error in tcgetattr"); + return FALSE; + } + + if (onoff) + settings.c_lflag |= value; + else + settings.c_lflag &= ~value; + + result = tcsetattr(fileno(fd), TCSANOW, &settings); + if (result < 0) + { + perror("error in tcgetattr"); + return FALSE; + } +#endif + + return TRUE; +} + +/**************************************************************************** +*# +*# FUNCTION NAME: WaitForRead +*# +*# PARAMETERS: Timeout in usecs. +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 961001 ronny Initial version +*# 971204 ronny usecs was a only one tenth of what it should be. +*# +*#***************************************************************************/ + +int +WaitForRead(int s, int usecs) +{ + fd_set mask; + int ret; + struct timeval tm; + + tm.tv_sec = usecs/1000000; + tm.tv_usec = usecs%1000000; + + FD_ZERO(&mask); + FD_SET(s, &mask); + + if ((ret = select(FD_SETSIZE, &mask, NULL, NULL, &tm)) == -1) { + printf("<<< select failed with return: %d.\n", ret); + return FALSE; + } + else { + if (db3) printf("* select returned OK:%d\n", ret); + } + + if (FD_ISSET(s, &mask) == 0) { + if (db2) printf("<<< WaitForRead. No data to read.\n"); + return FALSE; + } + + if (db3) printf("<<< WaitForRead OK. Returned:%d.\n", ret); + + return TRUE; +} + +/**************************************************************************** +*# +*# FUNCTION NAME: WaitForWrite +*# +*# PARAMETERS: +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 2000-11-20 ronny Initial version +*# +*#***************************************************************************/ + +int +WaitForWrite(int s, int usecs) +{ + fd_set mask; + int ret; + struct timeval tm; + + tm.tv_sec = usecs/1000000; + tm.tv_usec = usecs%1000000; + + FD_ZERO(&mask); + FD_SET(s, &mask); + + if ((ret = select(FD_SETSIZE, NULL, &mask, NULL, &tm)) == -1) { + printf("<<< select failed with return: %d.\n", ret); + return FALSE; + } + else { + if (db3) printf("* select returned OK:%d\n", ret); + } + + if (FD_ISSET(s, &mask) == 0) { + if (db2) printf("<<< WaitForWrite. No data to read.\n"); + return FALSE; + } + + if (db3) printf("<<< WaitForWrite OK. Returned:%d.\n", ret); + + return TRUE; +} diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/serial.h b/target/linux/etrax-2.6/image/e100boot/src/sbl/serial.h new file mode 100644 index 0000000000..98e68200c9 --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/serial.h @@ -0,0 +1,26 @@ +/*!*************************************************************************** +*! +*! FILE NAME : serial.h +*! +*! DESCRIPTION: Serial boot stuff for e100boot. +*! +*! --------------------------------------------------------------------------- +*! HISTORY +*! +*! DATE NAME CHANGES +*! ---- ---- ------- +*! 1996 Ronny Raneup Initial version +*! 2002 05 02 Ronny Ranerup Moved it into this file +*! --------------------------------------------------------------------------- +*! (C) Copyright 1999, 2000, 2001, 2002 Axis Communications AB, LUND, SWEDEN +*!***************************************************************************/ +/************************** Include files ********************************/ +/************************** Type definitions *****************************/ +/************************** Global variables *****************************/ + +extern int set_baudrate; /* Baudrate for serial boot (after bootloader). */ + +/************************** Constants and macros *************************/ +/************************** Function prototypes **************************/ +int SetupSerial (void); +void SerBoot (void); diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/win32/Makefile b/target/linux/etrax-2.6/image/e100boot/src/sbl/win32/Makefile new file mode 100644 index 0000000000..cb8911a0ac --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/win32/Makefile @@ -0,0 +1,8 @@ +%.o : %.c + gcc -mno-cygwin -c -g -Wall -I ../ -I ../../cbl/src/ -I ../../wpdpack/Include -o $@ $< + +etrax100boot : common.o network.o boot_images.o + gcc -mno-cygwin -g -Wall -L ../../wpdpack/Lib -o $@ $^ -lwpcap -lpacket -lws2_32 + +clean : + rm -f *.o etrax100boot diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/win32/boot_images.c b/target/linux/etrax-2.6/image/e100boot/src/sbl/win32/boot_images.c new file mode 100755 index 0000000000..a09dc9ddb1 --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/win32/boot_images.c @@ -0,0 +1,35 @@ +/* boot_images.c - Collection of the different boot images + * Johan Adolfsson Axis Communications AB + * $Id: boot_images.c,v 1.1 2004/01/26 10:52:40 mikaelp Exp $ + */ + +#include +#include "boot_images.h" + +/* We include the C files here to the size etc. easy */ +#include "net_ima.c" +#include "ser_ima.c" +#include "net_noleds_ima.c" +#include "ser_noleds_ima.c" + +struct boot_image_info_type boot_image_info[] = +{ + { INTERNAL_NW, net_ima, sizeof net_ima, "Network boot (default)"}, + { INTERNAL_SER, ser_ima, sizeof ser_ima, "Serial boot"}, + { INTERNAL_SER_NOLEDS, ser_noleds_ima, sizeof ser_noleds_ima, "Serial boot, no leds"}, + { INTERNAL_NW_NOLEDS, net_noleds_ima, sizeof net_noleds_ima, "Network boot, no leds"}, + + { "DBGNONE", net_ima, sizeof net_ima, "Obsolete (use INTERNAL_NW instead)" }, + { "DBG0", net_ima, sizeof net_ima, "Obsolete (use INTERNAL_NW instead)" }, + { "DBG1", net_ima, sizeof net_ima, "Obsolete (use INTERNAL_NW instead)" }, + { "DBG2", net_ima, sizeof net_ima, "Obsolete (use INTERNAL_NW instead)" }, + { "DBG3", net_ima, sizeof net_ima, "Obsolete (use INTERNAL_NW instead)" }, + + { "DBGNONE_NOLEDS", net_noleds_ima, sizeof net_noleds_ima, "Obsolete (use INTERNAL_NW_NOLEDS instead)" }, + { "DBG0_NOLEDS", net_noleds_ima, sizeof net_noleds_ima, "Obsolete (use INTERNAL_NW_NOLEDS instead)" }, + { "DBG1_NOLEDS", net_noleds_ima, sizeof net_noleds_ima, "Obsolete (use INTERNAL_NW_NOLEDS instead)" }, + { "DBG2_NOLEDS", net_noleds_ima, sizeof net_noleds_ima, "Obsolete (use INTERNAL_NW_NOLEDS instead)" }, + { "DBG3_NOLEDS", net_noleds_ima, sizeof net_noleds_ima, "Obsolete (use INTERNAL_NW_NOLEDS instead)" }, + + { NULL, NULL, 0, NULL } /* End of array */ +}; diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/win32/common.c b/target/linux/etrax-2.6/image/e100boot/src/sbl/win32/common.c new file mode 100644 index 0000000000..fd47a5310c --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/win32/common.c @@ -0,0 +1,1651 @@ +/*!*************************************************************************** +*! +*! FILE NAME : common.c +*! +*! DESCRIPTION: Common functions for e100boot. +*! +*! --------------------------------------------------------------------------- +*! HISTORY +*! +*! DATE NAME CHANGES +*! ---- ---- ------- +*! ??? ? ???? Ronny Ranerup Initial version +*! --------------------------------------------------------------------------- +*! (C) Copyright 1999-2003 Axis Communications AB, LUND, SWEDEN +*!***************************************************************************/ +/* $Id: common.c,v 1.1 2004/01/26 10:52:40 mikaelp Exp $ */ + +/************************** Version **************************************/ + +char version[] = "Time-stamp: $Id: common.c,v 1.1 2004/01/26 10:52:40 mikaelp Exp $"; + +/************************** Include files ********************************/ + +#define WIN32_LEAN_AND_MEAN +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include "boot_images.h" +#include +#include +#include + +#include +#include + +/************************** Constants and macros *************************/ + +#define BOOT_CMDS_FILE "BOOT_CMDS" + +/************************** Type definitions *****************************/ + +struct label_t { + struct label_t *prev; + udword addr; + char *name; +}; + +/************************** Global variables *****************************/ + +char needle[MAX_STRING_LEN] = "END"; /* search needle for --find */ +int needle_len = 3; + +int exitonfind = FALSE; + +int doing_flash = FALSE; /* Just a flag to see if we should + warn that it might take some + time. */ + +int toFiles = FALSE; /* Dump all packets to files. */ +int cmdsOnly = FALSE; /* Just dump boot cmds to file. */ +int netBoot = TRUE; /* Do network boot? */ +int serBoot = FALSE; /* Do serial boot? */ + +struct label_t *loop_label = NULL; +struct label_t *label = NULL; + +struct packet_buf *first_packet = NULL; +struct packet_buf *last_packet = NULL; + +struct packet_buf *boot_cmds_packet; + +int create_boot_loader = TRUE; + +/* We use the INTERNAL boot image as default */ +char boot_loader_file[MAX_STRING_LEN] = INTERNAL_NW; + +int noleds = FALSE; /* Use boot images that doesn't toggle leds? */ + +struct boot_files_T *first_boot_file = NULL; +struct boot_files_T *last_boot_file = NULL; + +unsigned int boot_cmds[SIZE_OF_BOOT_CMDS / sizeof(unsigned int)]; +int boot_cmds_cnt = 0; + +int svboot = FALSE; + +int quiet = 0; + +struct packet_header_T send_packet; +struct packet_header_T *receive_packet; + +int seq_nr = 0; + +/* debug flags */ +int db1 = FALSE; +int db2 = FALSE; +int db3 = FALSE; +int db4 = FALSE; + +char device[MAX_STRING_LEN] = ""; + + +/************************** Function prototypes **************************/ + +FILE *Fopen (const char *name, const char *mode); +int main (int argc, const char *argv[]); +int GetNumberOption (int *argNr, int argCount, const char *argVect[], unsigned int *ret, const char *option, int base); +int GetStringOption (int *argNr, int argCount, const char *argVect[], char *ret, const char *option); +int GetRegisterOption (int *argNr, int argCount, const char *argVect[], unsigned int *ret, const char *option, int base); +struct boot_files_T* allocate_boot_file (struct boot_files_T *bf); +struct packet_buf* CreateNewBootPacket (void); +struct packet_buf* allocate_packet (struct packet_buf *p); +void SigHandler (int sig); +void CreateBootLoader (void); +void FinishBootCmds (void); +void ParseArgs (int argc, const char *argv[]); +void PrintHelp (void); +void CreateBootCmds (void); +void handle_labels (void); +void new_label (struct label_t **label, udword addr, const char *name); + +/**************************************************************************** +*# +*# FUNCTION NAME: main +*# +*# PARAMETERS: Command line arguments. +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 961022 ronny Initial version +*# +*#***************************************************************************/ + +int +main(int argc, const char *argv[]) +{ + ParseArgs(argc, argv); + + if (cmdsOnly) { + /* We make this a special case to avoid messing up other code. */ + CreateBootCmds(); + FinishBootCmds(); + SendToDevice(&boot_cmds_packet->data[SIZE_OF_HEADER],SIZE_OF_BOOT_CMDS); + exit(EXIT_SUCCESS); + } + + if (netBoot && !toFiles) { + /* Do not bother with this if we just want to write the packets to + files. Means you do not have to be root to run --tofiles. */ + net_init(); + } + else if (serBoot) { + /*if (!SetupSerial())*/ { + exit(0); + } + } + + CreateBootLoader(); + CreateBootCmds(); + FinishBootCmds(); + + printf("Starting boot...\n"); + if (doing_flash) { + printf("We're doing a flash write, this may take up to a few minutes...\n"); + } + + if (toFiles) { + udword seq = 0; + struct packet_buf *p; + + while((p = create_packet(seq++))) { + SendToDevice(p->data, p->size); + } + + exit(EXIT_SUCCESS); + } + + if (netBoot) { + NetBoot(); + } + else if (serBoot) { + /*SerBoot();*/ + } + + printf("Done.\n"); + return EXIT_SUCCESS; +} /* main */ + +/**************************************************************************** +*# +*# FUNCTION NAME: free_packet +*# +*# PARAMETERS: struct to free +*# +*# DESCRIPTION: Frees struct and data in struct. +*# +*# RETURNS: Pointer to next struct. +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 2000 02 07 ronny Initial version +*# +*#***************************************************************************/ + +struct packet_buf* +free_packet(struct packet_buf *p) +{ + struct packet_buf *next_p; + + next_p = p->next; + free(p->data); + free(p); + return(next_p); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: create_packet +*# +*# PARAMETERS: Sequence number of desired packet. +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 2000 06 28 ronny Initial version +*# +*#***************************************************************************/ + +struct packet_buf* +create_packet(udword seq) +{ + struct packet_buf *p = first_packet; + /* Should check last first? */ + + if (db4) printf("> create_packet seq %d\n", seq); + + while (p) { + if (p->seq == seq) { + return(p); + } + p = p->next; + } + + return(CreateNewBootPacket()); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: find_string +*# +*# PARAMETERS: New string to search. +*# +*# DESCRIPTION: Searches a number of strings for needle[], including strings +*# overlapping between different calls. +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 020502 ronny Initial version +*# +*#***************************************************************************/ + +void +find_string(char *str) +{ + static int matched = 0; + int hs[MAX_STRING_LEN]; + static int cur_hs = 0; + static int hs_len = 0; + static int last_hs = 0; + + static int cur_needle = 0; + + if (!needle[0]) { + return; + } + // printf("# adding >%s<\n", str); + + { + int c = 0; + int s = 0; + + while((c = str[s])) { + // printf("\n# cur_hs %d, hs_len %d\n", cur_hs, hs_len); + { + int i; + + for(i = 0; i != hs_len; i++) { + // printf("hs[%d] = %d(%c)\n", i, (int)hs[i], hs[i] < 32 ? 'X' : hs[i]); + } + } + + if (cur_hs == hs_len) { + // printf("adding char %d(%c) at hs[%d]\n", (int)c, c < 32 ? 'X' : c, hs_len); + hs[hs_len] = c; + hs_len++; + s++; + } + + // printf("testing %d at cur_hs %d against %d at cur_needle %d\n", + // (int)hs[cur_hs], cur_hs, (int)needle[cur_needle], cur_needle); + + if (hs[cur_hs] == needle[cur_needle]) { + if (cur_needle+1 == needle_len) { + int exitcode = EXIT_SUCCESS; + + // printf("\nFound needle from --find option.\n"); + if (exitonfind) { + int ret; + // printf("scanf (s=%d)'%s'\n", s, &str[s+1]); + ret = sscanf(&str[s+1], "%i", &exitcode); + // printf("ret %d, '%s'\n", ret, &str[s+1]); + } + printf("Exiting with code %d\n", exitcode); + exit(exitcode); + } + cur_needle++; + cur_hs++; + } + else { + // printf("no match, shifting hs.\n"); + { + int i; + for(i=0; i!= hs_len-1; i++) { + hs[i] = hs[i+1]; + } + } + hs_len--; + cur_needle = 0; + cur_hs = 0; + } + } + } +} + +/**************************************************************************** +*# +*# FUNCTION NAME: Fopen +*# +*# PARAMETERS: Name and mode, both strings. +*# +*# DESCRIPTION: Opens a file and returns its fd, or NULL. +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 961022 ronny Initial version +*# +*#***************************************************************************/ + +FILE * +Fopen(const char *name, const char *mode) +{ + FILE *fd; + + if (db2) printf(">>> Fopen '%s', mode '%s'\n", name, mode); + + fd = fopen(name, mode); + + if (fd == NULL) { + printf("<<< Fopen failed on '%s', mode '%s'\n", name, mode); + return ((FILE*) NULL); + } + + if (strncmp(mode, "a", 1) == 0) { + if (db3) printf("* Append mode, seeking to end.\n"); + fseek(fd, 0L, SEEK_SET); + } + + if (db2) printf("<<< Fopen: '%s'\n", name); + + return(fd); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: ParseArgs +*# +*# PARAMETERS: Standard command line args. +*# +*# DESCRIPTION: Parses command line arguments. +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 960909 ronny Initial version +*#***************************************************************************/ + +void +ParseArgs (int argc, const char *argv[]) +{ + int argi; + int i; + int printHelp = FALSE; + int exitCode = EXIT_SUCCESS; + char dbStr[MAX_STRING_LEN]; /* Debug option string. */ + int number; + int argCount; + const char **argVect; + struct stat st; + + if (db4) printf(">>> ParseArgs\n"); + argCount = argc; + argVect = argv; + + for (argi = 1; argi < argCount; argi++) { + if (db4) printf("argv[%d] = '%s'\n", argi, argVect[argi]); + if (strncmp(argVect[argi], "--from", 6) == 0) { + if (GetStringOption(&argi, argCount, argVect, host1, "--from") == 0) { + printHelp = TRUE; + exitCode = EXIT_FAILURE; + } + else { + printf("Host: %s %s\n", host1, host2); + if (sscanf(host1, "%x-%x-%x-%x-%x-%x", &i, &i, &i, &i, &i, &i) == 6) { + printf("Ethernet address\n"); + } + } + } + + else if (strncmp(argVect[argi], "--device", 8) == 0) { + if (GetStringOption(&argi, argCount, argVect, device, "--device") == 0) { + printHelp = TRUE; + exitCode = EXIT_FAILURE; + } + } + + else if (strncmp(argVect[argi], "--network", 9) == 0) { + netBoot = TRUE; + serBoot = FALSE; + strcpy(boot_loader_file, INTERNAL_NW); + } + + else if (strncmp(argVect[argi], "--serial", 8) == 0) { + serBoot = TRUE; + netBoot = FALSE; + strcpy(device, "/dev/ttyS0"); + strcpy(boot_loader_file, INTERNAL_SER); + } + + else if (strncmp(argVect[argi], "--noleds", 8) == 0) { + noleds = TRUE; + } + + else if (strncmp(argVect[argi], "--images", 8) == 0) { + int i = 0; + + printf("Internal images:\n"); + + while(boot_image_info[i].name) { + printf("'%s', %s, size %lu bytes.\n", + boot_image_info[i].name, + boot_image_info[i].info, + boot_image_info[i].len + ); + i++; + } + exit(EXIT_SUCCESS); + } + + else if (strncmp(argv[argi], "--baudrate", 10) == 0) { + /* if (GetNumberOption (&argi, argCount, argVect, &set_baudrate, "--baudrate", 10) == 0)*/ { + printHelp = TRUE; + exitCode = EXIT_FAILURE; + } + } + + else if (strncmp(argVect[argi], "--tofiles", 9) == 0) { + toFiles = TRUE; + } + + else if (strncmp(argVect[argi], "--cmdsonly", 10) == 0) { + cmdsOnly = TRUE; + } + + else if (strncmp(argVect[argi], "--to", 4) == 0) { + if ((GetStringOption(&argi, argCount, argVect, host2, "--to") == 0)) { + printHelp = TRUE; + exitCode = EXIT_FAILURE; + } + else { + printf("Host: %s %s\n", host1, host2); + both_addresses = TRUE; + if (sscanf(host2, "%x-%x-%x-%x-%x-%x", &i, &i, &i, &i, &i, &i) == 6) { + printf("Ethernet address\n"); + } + } + } + + else if (strncmp(argVect[argi], "--printp", 8) == 0) { + pPacket = 1; + } + + else if (strncmp(argVect[argi], "--printascii", 11) == 0) { + pPacket = 1; + printPacketType = ASCII; + } + + else if (strncmp(argVect[argi], "--printudec", 11) == 0) { + pPacket = 1; + printPacketType = UDEC; + } + + else if (strncmp(argVect[argi], "--printhex", 10) == 0) { + pPacket = 1; + printPacketType = HEX; + } + + else if (strncmp(argVect[argi], "--bpl", 5) == 0) { + if (GetNumberOption(&argi, argCount, argVect, &p_packet_bpl, "--bpl", 10) == 0) { + printHelp = TRUE; + exitCode = EXIT_FAILURE; + } + } + + else if (strncmp(argVect[argi], "--promisc", 11) == 0) { + promisc = 1; + } + + else if (strncmp(argVect[argi], "--5400", 6) == 0) { + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = 0xb0000000; + boot_cmds[boot_cmds_cnt++] = 0x000095b6; + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = 0xb0000008; + boot_cmds[boot_cmds_cnt++] = 0x0000e751; + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = 0xb000000c; + boot_cmds[boot_cmds_cnt++] = 0x12604040; + } + + else if (strncmp(argVect[argi], "--5600", 6) == 0) { + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = 0xb0000000; + boot_cmds[boot_cmds_cnt++] = 0x000095b6; + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = 0xb0000008; + boot_cmds[boot_cmds_cnt++] = 0x00006751; + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = 0xb000000c; + boot_cmds[boot_cmds_cnt++] = 0x12204040; + } + + else if (strncmp(argVect[argi], "--testcardlx", 12) == 0) { + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = (unsigned int)R_DRAM_CONFIG; + boot_cmds[boot_cmds_cnt++] = 0x12604040; + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = (unsigned int)R_DRAM_TIMING; + boot_cmds[boot_cmds_cnt++] = 0x0000e751; + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = (unsigned int)R_WAITSTATES; + boot_cmds[boot_cmds_cnt++] = 0x00b395b5; + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = (unsigned int)R_BUS_CONFIG; + boot_cmds[boot_cmds_cnt++] = 0x00000207; + } + + else if (strncmp(argVect[argi], "--testcard", 10) == 0) { + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = (unsigned int)R_WAITSTATES; + boot_cmds[boot_cmds_cnt++] = 0x000010b3; + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = (unsigned int)R_DRAM_TIMING; + boot_cmds[boot_cmds_cnt++] = 0x00006543; + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = (unsigned int)R_DRAM_CONFIG; + boot_cmds[boot_cmds_cnt++] = 0x12966060; + } + + else if (strncmp(argVect[argi], "--devboard", 10) == 0) { + /* Printing on serial port will not work until PORT_PB is set... */ + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = (unsigned int)R_PORT_PB_SET; + boot_cmds[boot_cmds_cnt++] = 0x01001ef3; + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = (unsigned int)R_PORT_PA_SET; + boot_cmds[boot_cmds_cnt++] = 0x00001df0; + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = (unsigned int)R_WAITSTATES; + boot_cmds[boot_cmds_cnt++] = 0x000095a6; + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = (unsigned int)R_DRAM_CONFIG; + boot_cmds[boot_cmds_cnt++] = 0x1a200040; + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = (unsigned int)R_DRAM_TIMING; + boot_cmds[boot_cmds_cnt++] = 0x00005611; + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + boot_cmds[boot_cmds_cnt++] = (unsigned int)R_BUS_CONFIG; + boot_cmds[boot_cmds_cnt++] = 0x00000104; + } + + else if (strncmp(argVect[argi], "--verify", 8) == 0) { + boot_cmds[boot_cmds_cnt++] = MEM_VERIFY; + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--verify", 16); + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--verify", 16); + } + + else if (strncmp(argVect[argi], "--setreg", 8) == 0) { + boot_cmds[boot_cmds_cnt++] = SET_REGISTER; + if ((argVect[argi+1][0] >= 'A') && (argVect[argi+1][0] <= 'Z')) { + GetRegisterOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--setreg", 16); + } + else { + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--setreg", 16); + } + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--setreg", 16); + } + + else if (strncmp(argVect[argi], "--getreg", 8) == 0) { + boot_cmds[boot_cmds_cnt++] = GET_REGISTER; + if ((argVect[argi+1][0] >= 'A') && (argVect[argi+1][0] <= 'Z')) { + GetRegisterOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--getreg", 16); + } + else { + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--getreg", 16); + } + } + + else if (strncmp(argVect[argi], "--pause", 7) == 0) { + boot_cmds[boot_cmds_cnt++] = PAUSE_LOOP; + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--pause", 16); + } + + else if (strncmp(argVect[argi], "--memtest", 9) == 0) { + boot_cmds[boot_cmds_cnt++] = MEM_TEST; + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--memtest", 16); + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--memtest", 16); + } + + else if (strncmp(argVect[argi], "--loop", 6) == 0) { + char str[MAX_STRING_LEN]; + boot_cmds[boot_cmds_cnt++] = LOOP; + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--loop", 16); + GetStringOption(&argi, argCount, argVect, str, argVect[argi]); + new_label(&loop_label, boot_cmds_cnt+1, str); + boot_cmds_cnt++; + } + + else if (strncmp(argVect[argi], "--label", 7) == 0) { + char str[MAX_STRING_LEN]; + GetStringOption(&argi, argCount, argVect, str, "--label"); + new_label(&label, boot_cmds_cnt, str); + } + + else if (strncmp(argVect[argi], "--memdump", 9) == 0) { + boot_cmds[boot_cmds_cnt++] = MEM_DUMP; + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--memdump", 16); + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--memdump", 16); + } + + else if (strncmp(argVect[argi], "--memclear", 10) == 0) { + boot_cmds[boot_cmds_cnt++] = MEM_CLEAR; + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--memclear", 16); + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--memclear", 16); + } + + else if (strncmp(argVect[argi], "--flash", 7) == 0) { + boot_cmds[boot_cmds_cnt++] = FLASH; + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--flash", 16); + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--flash", 16); + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--flash", 16); + doing_flash = TRUE; + } + + else if (strncmp(argVect[argi], "--jump", 6) == 0) { + boot_cmds[boot_cmds_cnt++] = JUMP; + GetNumberOption(&argi, argCount, argVect, &boot_cmds[boot_cmds_cnt++], "--jump", 16); + } + + else if (strncmp(argVect[argi], "--file", 6) == 0) { + char str[MAX_STRING_LEN]; + boot_cmds[boot_cmds_cnt++] = PACKET_INFO; + GetStringOption(&argi, argCount, argVect, + str, "--file"); /* file name */ + GetNumberOption(&argi, argCount, argVect, + &boot_cmds[boot_cmds_cnt++], str, 16); /* address */ + last_boot_file = allocate_boot_file(last_boot_file); + first_boot_file = first_boot_file ? first_boot_file : last_boot_file; + last_boot_file->fileName = malloc(strlen(str) + 1); + strcpy(last_boot_file->fileName, str); + last_boot_file->size_p = &boot_cmds[boot_cmds_cnt]; + last_boot_file->fd = NULL; + last_boot_file->size_sent = 0; + if (strncmp(str, "-", 1) != 0) { + if (stat(last_boot_file->fileName, &st) == -1) { + printf("Cannot get size of file '%s'. %s.\n", + last_boot_file->fileName, strerror(errno)); + exit(EXIT_FAILURE); + } + if (db2) printf("* size is %d 0x%8.8x\n", + (int)st.st_size, (unsigned int)st.st_size); + last_boot_file->size = st.st_size; + boot_cmds[boot_cmds_cnt++] = st.st_size; + } + else { + GetNumberOption(&argi, argCount, argVect, + &last_boot_file->size , str, 16); /* size */ + + boot_cmds[boot_cmds_cnt++] = last_boot_file->size; + printf("* size is %d 0x%8.8x\n", last_boot_file->size, + last_boot_file->size); + } + } + + else if (strncmp(argVect[argi], "--bootfile", 10) == 0) { + GetStringOption(&argi, argCount, argVect, + boot_loader_file, "--bootfile"); + } + + else if (strncmp(argVect[argi], "-d", 2) == 0) { + if (GetNumberOption (&argi, argCount, argVect, &number, "-d", 10) == 0) { + printHelp = TRUE; + exitCode = EXIT_FAILURE; + } + else { + sprintf(dbStr, "%d", number); + for (i = 0; i != (int) strlen(dbStr); i++) { + switch (dbStr[i] - '0') { + case 1: + db1 = TRUE; + break; + case 2: + db2 = TRUE; + break; + case 3: + db3 = TRUE; + break; + case 4: + db4 = TRUE; + break; + default: + printf("ERROR! Debug level %d is not defined.\n", dbStr[i] - '0'); + printHelp = TRUE; + exitCode = EXIT_FAILURE; + break; + } + } + } + } + + else if (strncmp(argVect[argi], "--find", 6) == 0) { + GetStringOption(&argi, argCount, argVect, needle, "--find"); + /* convert control characters like /n to the real ascii valure */ + { + int i; + int j = 0; + char c; + int esc = 0; + + for (i = 0; (c = needle[i]); i++,j++) { +// printf("c = %d, i %d, j %d\n", (int)c, i, j); + if (c == '\\') { +// printf("esc\n"); + esc = 1; + continue; + } + else if (esc) { + esc = 0; + switch(c) { + case 'r': + c = '\r'; + break; + + case 'n': + c = '\n'; + break; + + case '\\': + c = '\\'; + break; + + default: + printf("Uknown escape sequence '\\%c'\n", c); + exit(EXIT_FAILURE); + } + j--; + } + // printf("setting j %d to %d\n", j, (int)c); + needle[j] = c; + } + needle_len = j; + } + + for (i = 0; needle[i]; i++) { + //printf("i = %d, c %d\n", i,(int)needle[i]); + } + } + + else if (strncmp(argVect[argi], "--exitonfind", 12) == 0) { + exitonfind = TRUE; + } + + else if (strncmp(argVect[argi], "--help", 6) == 0) { + printHelp = TRUE; + } + + else { + printf("ERROR! Don't understand option '%s'\n", argVect[argi]); + printHelp = TRUE; + exitCode = EXIT_FAILURE; + } + } + + if (printHelp == TRUE) { + PrintHelp(); + exit(exitCode); + } + + if (noleds) { + strcpy(&boot_loader_file[strlen(boot_loader_file)], "_NOLEDS"); + } + + handle_labels(); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: handle_labels +*# +*# PARAMETERS: global loop_label, label +*# +*# DESCRIPTION: Checks and matches labels from --loop and --label commands +*# and inserts the resolved addresses into boot commands. +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 20020204 ronny Initial version +*# +*#***************************************************************************/ + +void +handle_labels(void) +{ + struct label_t *ll = loop_label; + struct label_t *l = label; + struct label_t *last_l = l; + + while(ll) { + int match = 0; + + l = last_l; + while(l) { + match = 0; + + if (l->name && ll->name && (strcmp(l->name, ll->name) == 0)) { + match = 1; + boot_cmds[ll->addr] = IO_BUF_START+(l->addr*4); + break; + } + l = l->prev; + } + if (!match) { + printf("Error. No label '%s' defined as needed by --loop command.\n", ll->name); + exit(EXIT_FAILURE); + } + ll = ll->prev; + } +} + +/**************************************************************************** +*# +*# FUNCTION NAME: new_label +*# +*# PARAMETERS: +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 20020201 ronny Initial version +*# +*#***************************************************************************/ + +void +new_label(struct label_t **label, udword addr, const char *name) +{ + struct label_t *new_p; + + new_p = malloc(sizeof(struct label_t)); + + if (*label == NULL) { /* first one? */ + *label = new_p; + new_p->prev = NULL; + } + else { + new_p->prev = *label; + } + *label = new_p; + new_p->addr = boot_cmds_cnt; + new_p->name = malloc(strlen(name)); + strcpy(new_p->name, name); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: GetStringOption +*# +*# PARAMETERS: int *argNr : Returns next argc here. +*# int argCount : Index of last argument. +*# char *argVect[] : argv. +*# char *ret : Copy string here. +*# char *option : Name of the option. +*# +*# DESCRIPTION: Extracts a string option from argv, and updates argnr. +*# Returns TRUE/FALSE and string in *ret. +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 960930 ronny Initial version +*# 961203 ronny Handles filenames with spaces within 'file name'. +*# +*#***************************************************************************/ + +int +GetStringOption(int *argNr, int argCount, const char *argVect[], char *ret, + const char *option) +{ + int startChar = strlen(option); + + *ret = '\0'; + + /* Are there any more chars after option? If not skip to next argv. */ + if (strlen(argVect[*argNr]) <= (unsigned int)startChar) { + (*argNr)++; + startChar = 0; + } + + /* Any args left? */ + if (*argNr >= argCount) { + printf("ERROR! The option '%s' needs a string argument.\n", option); + PrintHelp(); + exit(EXIT_FAILURE); + } + + /* avoid stack overflow hacks */ + if (strlen(&argVect[*argNr][startChar]) > MAX_STRING_LEN) { + printf("Argument '%s' longer than maximum allowable %d characters.\n", + &argVect[*argNr][startChar], MAX_STRING_LEN); + exit(EXIT_FAILURE); + } + + strcpy(ret, &argVect[*argNr][startChar]); + if (db4) printf("<<< GetStringOption '%s'\n", ret); + + return TRUE; +} + +/**************************************************************************** +*# +*# FUNCTION NAME: GetNumberOption +*# +*# PARAMETERS: +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 960930 ronny Initial version +*# +*#***************************************************************************/ + +int +GetNumberOption(int *argNr, int argCount, const char *argVect[], + unsigned int *ret, const char *option, int base) +{ + int startChar = 0; + int add_io_base = 0; + + (*argNr)++; + + if (*argNr >= argCount) { + printf("ERROR! The option '%s' needs a number argument.\n", option); + PrintHelp(); + exit(EXIT_FAILURE); + } + + if (argVect[*argNr][startChar] == '+') { + add_io_base = 1; + startChar++; + } + + *ret = strtoul(&argVect[*argNr][startChar], NULL, base); + + if (add_io_base) { + *ret += IO_BUF_START; + if (*ret < IO_BUF_START || *ret >= IO_BUF_END) { + printf("ERROR! '%s' is outside the IO buffer (option '%s').\n", + argVect[*argNr], option); + exit(EXIT_FAILURE); + } + } + + if (db4) printf("<<< GetNumberOption %08x\r\n", *ret); + + return TRUE; +} + +/**************************************************************************** +*# +*# FUNCTION NAME: GetRegisterOption +*# +*# PARAMETERS: +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 960930 ronny Initial version +*# +*#***************************************************************************/ + +int +GetRegisterOption(int *argNr, int argCount, const char *argVect[], + unsigned int *ret, const char *option, int base) +{ + int startChar = 0; + + (*argNr)++; + + if (*argNr >= argCount) { + printf("Error! The option '%s' needs a register name.\n", option); + PrintHelp(); + exit(EXIT_FAILURE); + } + + { + int r = 0; + + while (reg_des[r].name) { + if (strcmp(reg_des[r].name, argVect[*argNr]) == 0) { + *ret = reg_des[r].addr; + return TRUE; + break; + } + r++; + } + } + + printf("Error! Didn't find a register name matching '%s'.\n", + argVect[*argNr]); + + exit(EXIT_FAILURE); + + return FALSE; +} + +/**************************************************************************** +*# +*# FUNCTION NAME: PrintHelp +*# +*# PARAMETERS: None. +*# +*# DESCRIPTION: Prints help info. +*# +*#--------------------------------------------------------------------------- +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 960909 ronny Initial version +*# +*#***************************************************************************/ + +void +PrintHelp(void) +{ + printf("e100boot version %s.\n", version); + + printf("\ne100boot [--device devicename] [--file filename|- addr [size]]\n" + " [--flash ram-source flash-offset size]\n" + " [--pause iter]\n" + " [--memtest addr addr]\n" + " [--memclear addr addr] [--memdump addr addr]\n" + " [--setreg addr|regname val] [--getreg addr|regname]\n" + " [--verify addr val] [--label label] [--loop addr label]\n" + " [--5400] [--5600] [--testcard] [--devboard]\n" + " [--testcardlx] [--network] [--serial]\n" + " [--baudrate baudrate] [--bootfile file] [--jump addr]\n" + " [--tofiles] [--cmdsonly] [--images] [--noleds]\n" + " [--help]\n\n"); + + printf(" The commands sent to the cbl, and which are parsed by the cbl,\n" + " are stored at 0x%8.8x-0x%8.8x.\n\n", IO_BUF_START, IO_BUF_END); + + printf(" See the man page for more details about e100boot.\n\n"); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: CreateBootLoader +*# +*# PARAMETERS: None. +*# +*# DESCRIPTION: Creates boot packets from boot file or internal loader. +*# +*#--------------------------------------------------------------------------- +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 960909 ronny Initial version +*#***************************************************************************/ + +void +CreateBootLoader(void) +{ + struct stat st; + char *buf = NULL; + // int size_pos = 0x18; + // int addr_pos = 0x28; + struct packet_header_T *ph; + int packet_size; + int header_size; + int buf_cnt = 0; + int i; + udword sum = 0; + + if (create_boot_loader) { + int image_nbr = 0; + int found = 0; + const struct boot_image_info_type *info; + + if (db4) printf("> CreateBootLoader\n"); + + info = &boot_image_info[image_nbr]; + + /* Use internal boot loader? */ + while (!found && info->name != NULL) { + if (strcmp(boot_loader_file, info->name) == 0) { + st.st_size = info->len; + buf = (char*) malloc(st.st_size); + memcpy(buf, info->ptr, st.st_size); /* unnecessary? */ + found = TRUE; + printf("Using internal boot loader: %s - %s.\n", + info->name, info->info); + } + else { + image_nbr++; + info = &boot_image_info[image_nbr]; + } + } + + /* No internal? Load it from file instead. */ + if (!found) { + FILE *fd; + + /* We didn't find an internal match, load the boot file from disk. */ + if ((fd = Fopen(boot_loader_file, "r")) == NULL) { + printf("Cannot open bootloader '%s'. %s.\n", + boot_loader_file, strerror(errno)); + exit(EXIT_FAILURE); + } + + if (fstat(fileno(fd), &st) == -1) { + printf("Cannot get filestatus of bootloader '%s'. %s.\n", + boot_loader_file, strerror(errno)); + exit(EXIT_FAILURE); + } + + buf = (char*) malloc(st.st_size); + // printf("CreateBootLoader: buf = (char*) malloc(st.st_size); 2\n"); + if (read(fileno(fd), buf, st.st_size) != st.st_size) { + printf("Read fewer bytes than there should be in %s.\n", + boot_loader_file); + exit(EXIT_FAILURE); + } + + fclose(fd); + } + + /* Alright, got loader in buf[] and size in st. */ + if (netBoot) { + /* The etrax code for all boot methods are linked to adress + 380000f0 but since network boot starts execution at 380000f4 + we have two nops in the beginning of the code which we do not + transmit to etrax in the network case. The link adress + doesn't change though. */ + buf += 4; + st.st_size -= 4; + packet_size = DATA_SIZE; + } + else { + packet_size = st.st_size; + } + + /* Hack binary, insert size and address. */ + +#define SIZE_PATTERN 0x12345678 +#define ADDR_PATTERN 0x87654321 +#define SIZE_POS (netBoot ? 0x0c : 0x10) +#define ADDR_POS (netBoot ? 0x10 : 0x14) + + if (*(udword*)&buf[SIZE_POS] != SIZE_PATTERN) { + printf("Bootloader corrupt. Should contain ret/nop (0x%8.8x) at 0x%x, but contains %x\n", + SIZE_PATTERN, SIZE_POS, *(udword*)&buf[SIZE_POS]); + exit(EXIT_FAILURE); + } + + /* How much data to load except data in first packet. */ + + if (netBoot) { + *(udword*)(&buf[SIZE_POS]) = st.st_size - DATA_SIZE; + } + else { + *(udword*)(&buf[SIZE_POS]) = st.st_size - 784; + } + + if (db3) printf("Inserting boot size 0x%x at 0x%x.\n", + (unsigned int) *(udword*)(&buf[SIZE_POS]), + (unsigned int)&buf[SIZE_POS]); + + if (*(udword*)&buf[ADDR_POS] != ADDR_PATTERN) { + printf("Bootloader corrupt. Should contain ret/nop (0x%8.8x) at 0x%x, but contains %x\n", + ADDR_PATTERN, ADDR_POS, *(udword*)&buf[ADDR_POS]); + exit(EXIT_FAILURE); + } + + if (netBoot) { + *(udword*)(&buf[ADDR_POS]) = BOOT_ADDRESS + DATA_SIZE; + } + else { + *(udword*)(&buf[ADDR_POS]) = BOOT_ADDRESS-4 + 784; + } + + if (db3) printf("Inserting boot address 0x%x at 0x%x.\n", + (unsigned int)*(udword*)(&buf[ADDR_POS]), + (unsigned int)&buf[ADDR_POS]); + + + for (i = 0; i != st.st_size; i++) { + sum += ((byte*)buf)[i]; + } + if (db1) printf("Checksum 0x%x, bytes %d\n", sum, i); + + if (db4) { + int i; + + for(i=0; isize = packet_size; + last_packet->data = (char*)malloc(packet_size); + last_packet->seq = seq_nr; + last_packet->baud_rate = 9600; + + last_packet->boot_file = allocate_boot_file(NULL); + last_packet->boot_file->fileName = boot_loader_file; + + // printf("last_packet->size %8.8x\n", last_packet->size); + // printf("last_packet->data %8.8x\n",last_packet->data); + + if (netBoot) { + ph = (struct packet_header_T*) last_packet->data; + memcpy(ph->dest, dst_addr_of_device, 6); + memcpy(ph->src, eth_addr_local, 6); + ph->length = htons(packet_size); + ph->snap1 = htonl(SNAP1); + ph->snap2 = htonl(SNAP2); + ph->tag = htonl(SERVER_TAG); + ph->seq = htonl(seq_nr); + if (seq_nr != 0) { + ph->type = htonl(BOOT_PACKET); + ph->id = htonl(0); + } + } + + memcpy(&last_packet->data[header_size], &buf[buf_cnt], + packet_size - header_size); + if (db3) DecodeSvintoBoot(last_packet->data); + + if (netBoot) { + buf_cnt += DATA_SIZE; + } + else { + buf_cnt += packet_size +1; + } + + seq_nr++; + } + } + + if (db4) printf("< CreateBootLoader\n"); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: allocate_packet +*# +*# PARAMETERS: None. +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 960909 ronny Initial version +*#***************************************************************************/ + +struct packet_buf* +allocate_packet(struct packet_buf *p) +{ + if (db4) printf("> allocate_packet\n"); + + if (p) { + p->next = (struct packet_buf*) malloc(sizeof(struct packet_buf)); + p = p->next; + } + else { + p = (struct packet_buf*) malloc(sizeof(struct packet_buf)); + } + p->next = NULL; + + return(p); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: allocate_boot_file +*# +*# PARAMETERS: None. +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 960909 ronny Initial version +*#***************************************************************************/ + +struct boot_files_T* +allocate_boot_file(struct boot_files_T *bf) +{ + if (bf) { + bf->next = (struct boot_files_T*) malloc(sizeof(struct boot_files_T)); + bf = bf->next; + } + else { + bf = (struct boot_files_T*) malloc(sizeof(struct boot_files_T)); + } + bf->next = NULL; + + return(bf); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: CreateBootCmds +*# +*# PARAMETERS: None. +*# +*# DESCRIPTION: Creates a boot packet from the boot commands. The data is +*# filled in later by FinishBootCmds(). +*# +*#--------------------------------------------------------------------------- +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 980818 ronny Initial version +*#***************************************************************************/ + +void +CreateBootCmds(void) +{ + struct packet_header_T *ph; + + if (db4) printf("***> CreateBootCmds\n"); + + last_packet = allocate_packet(last_packet); + + boot_cmds_packet = last_packet; + + last_packet->boot_file = allocate_boot_file(NULL); + last_packet->boot_file->fileName = BOOT_CMDS_FILE; + last_packet->baud_rate = 9600; + + last_packet->size = netBoot ? SIZE_OF_BOOT_CMDS + sizeof(struct packet_header_T) + : SIZE_OF_BOOT_CMDS; + + last_packet->data = (char *) malloc(last_packet->size); + last_packet->seq = seq_nr; + + if (netBoot) { + /* Create packet header. */ + ph = (struct packet_header_T *) last_packet->data; + memcpy(ph->dest, dst_addr_of_device, 6); + memcpy(ph->src, eth_addr_local, 6); + ph->length = htons(last_packet->size); + ph->snap1 = htonl(SNAP1); + ph->snap2 = htonl(SNAP2); + ph->tag = htonl(SERVER_TAG); + ph->seq = htonl(seq_nr); + seq_nr++; + ph->type = htonl(BOOT_CMDS); + ph->id = htonl(0); + } + + if (db3) DecodeSvintoBoot(last_packet->data); + if (db4) printf("<*** CreateBootCmds\n"); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: FinishBootCmds +*# +*# PARAMETERS: None. +*# +*# DESCRIPTION: Copies the boot commands into the correct packet and changes +*# the dwords to network order. +*# +*#--------------------------------------------------------------------------- +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 960909 ronny Initial version +*#***************************************************************************/ + +void +FinishBootCmds(void) +{ + int i; + unsigned int offset = 0; + + for (i = 0; i != boot_cmds_cnt; i++) { + boot_cmds[i] = htonl(boot_cmds[i]); + if (db3) printf("%8.8x\n", boot_cmds[i]); + } + + /* Copy boot commands into packet. */ + if (netBoot) { + offset = sizeof(struct packet_header_T); + } + + memcpy(&boot_cmds_packet->data[offset], boot_cmds, + boot_cmds_cnt * sizeof(udword)); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: CreateNewBootPacket +*# +*# PARAMETERS: None. +*# +*# DESCRIPTION: Creates next packet for the files specified by '--file'. +*# +*# RETURNS: Next packet, or NULL. +*# +*#--------------------------------------------------------------------------- +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 960909 ronny Initial version +*#***************************************************************************/ + +struct packet_buf* +CreateNewBootPacket(void) +{ + static char buf[DATA_SIZE]; + struct packet_header_T *ph; + int packet_size; + int header_size; + int i; + udword sum; + int size = 0; + int padding = 0; + + static struct boot_files_T *bf = NULL; + + if (db3) printf("> CreateNewBootPacket\n"); + + bf = bf ? bf : first_boot_file; + + while (bf) { + if (!bf->fd) { + if (strcmp(bf->fileName, "-") == 0) { + bf->fd = stdin; + } + else { + bf->fd = fopen(bf->fileName, "rb"); + } + + if (bf->fd == NULL) { + printf("Cannot open boot file %s. Exiting\n", bf->fileName); + exit(EXIT_FAILURE); + } + if (db3) printf("Opening boot file %s\n", bf->fileName); + } + + if (!padding) { + size = fread(buf, 1, DATA_SIZE, bf->fd); + if (size == 0) { + if (db3) printf("Nothing more to read. Read: %d/%d\n", + bf->size_sent, bf->size); + padding = 1; + } + } + + if (padding) { + if (bf->size_sent < bf->size) { + if (db3) printf("padding...\n"); + size = (bf->size - bf->size_sent > DATA_SIZE) ? + DATA_SIZE : bf->size - bf->size_sent; + memset(buf, 0, size); + } + else { + if (db3) printf("All written\n"); + padding = 0; + size = 0; + } + } + + if (size != 0) { + if (db3) printf("size: %d %d/%d\n", size, bf->size_sent, bf->size); + bf->size_sent += size; + last_packet = allocate_packet(last_packet); + + /* Calculate checksum. */ + sum = 0; + for (i = 0; i != size; i++) { + sum += ((byte*)buf)[i]; + } + if (db2) printf("Checksum 0x%x, bytes %d\n", sum, i); + + /* Figure out size of packet. */ + if (netBoot) { + header_size = seq_nr == 0 ? + SIZE_OF_FIRST_HEADER : sizeof(struct packet_header_T); + + packet_size = ((size) < DATA_SIZE ? size : DATA_SIZE) + header_size; + } + else { + header_size = 0; + packet_size = size; + } + + if (packet_size < 60) { /* CRC adds 4 bytes to 64 */ + printf( + "Last packet from file '%s', is smaller than 64 bytes. \n" + "This is not allowed in the Ethernet standard. Will pad with %d " + "bytes.\n", bf->fileName, 60-packet_size); + + *(bf->size_p) += 60-packet_size; + packet_size = 60; + } + + last_packet->size = packet_size; + last_packet->data = (char*)malloc(packet_size); + last_packet->boot_file = bf; + last_packet->baud_rate = 0;/*set_baudrate;*/ + + /* printf("size %8.8x\n", last_packet->size);*/ + /* printf("data %8.8x\n",last_packet->data);*/ + + if (netBoot) { + /* Initialize ethernet header. */ + ph = (struct packet_header_T*) last_packet->data; + memcpy(ph->dest, dst_addr_of_device, 6); + memcpy(ph->src, eth_addr_local, 6); + /* printf("packet_size %d\n", packet_size);*/ + ph->length = htons(packet_size); + ph->snap1 = htonl(SNAP1); + ph->snap2 = htonl(SNAP2); + ph->tag = htonl(SERVER_TAG); + ph->seq = htonl(seq_nr); + last_packet->seq = seq_nr; + if (seq_nr != 0) { + ph->type = htonl(BOOT_PACKET); + ph->id = htonl(0); /* id doesn't matter, we send to a unicast address */ + } + } + + /* Copy data in place. */ + memcpy(&last_packet->data[header_size], buf, packet_size - header_size); + if (db2) DecodeSvintoBoot(last_packet->data); + /* PrintPacket(last_packet->data, last_packet->size, HEX);*/ + seq_nr++; + + if (db3) printf("< CreateNewBootPacket\n"); + return(last_packet); + } + else { /* Nothing read from fd. */ + fclose(bf->fd); + bf = bf->next; + } + } + + if (db3) printf("< CreateNewBootPacket\n"); + return(NULL); +} + +/****************** END OF FILE common.c ************************************/ diff --git a/target/linux/etrax-2.6/image/e100boot/src/sbl/win32/network.c b/target/linux/etrax-2.6/image/e100boot/src/sbl/win32/network.c new file mode 100755 index 0000000000..7ea5576273 --- /dev/null +++ b/target/linux/etrax-2.6/image/e100boot/src/sbl/win32/network.c @@ -0,0 +1,681 @@ +/*!*************************************************************************** +*! +*! FILE NAME : network.c +*! +*! DESCRIPTION: Network boot stuff for e100boot. +*! +*! --------------------------------------------------------------------------- +*! HISTORY +*! +*! DATE NAME CHANGES +*! ---- ---- ------- +*! 1996 Ronny Raneup Initial version +*! 2002 05 02 Ronny Ranerup Moved it into this file +*! --------------------------------------------------------------------------- +*! (C) Copyright 1999, 2000, 2001, 2002 Axis Communications AB, LUND, SWEDEN +*!***************************************************************************/ + +/************************** Include files ********************************/ + +#include +#define WIN32_LEAN_AND_MEAN +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include +#include +#include + +/************************** Constants and macros *************************/ + +#define CRC_LEN 4 + +/************************** Type definitions *****************************/ + +/************************** Global variables *****************************/ + +udword highest_ack_received; +udword last_ack_received = -1; +int new_ack = FALSE; +int got_new_packet = FALSE; + +unsigned char dst_addr_of_device[] = { 0x01, 0x40, 0x8c, 0x00, 0x01, 0x00 }; +unsigned char src_addr_of_device[] = { 0x02, 0x40, 0x8c, 0x00, 0x01, 0x00 }; +unsigned char eth_addr_local[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; + +struct sockaddr sock_addr; +int pPacket = 0; +pcap_t *pd; + +pcap_handler handler; + +struct packet_buf first_rec_packet; +struct packet_buf *last_rec_packet = &first_rec_packet; + +int promisc = 1; /* promiscuous mode */ +int all_ids = TRUE; + +int both_addresses = FALSE; +int p_packet_bpl = 8; +int printPacketType = CHAR; + +unsigned int id; +int one_id_only = TRUE; + +unsigned char buf[16000]; /* pcap buffer */ + +const struct pcap_pkthdr *hdrG; + +char host1[MAX_STRING_LEN]; /* name of ethernet host */ +char host2[MAX_STRING_LEN]; /* name of ethernet host */ + +/************************** Function prototypes **************************/ + +int gettimeofday (struct timeval *tv, void*); +int timeout (struct timeval *tvThen, int ms); +int highest_seq_received (void); +struct packet_buf* ack_on_seq (int seq); +struct packet_buf* packet_with_seq (int seq); +struct timeval timeval_subtract (struct timeval *x, struct timeval *y); +void GetNextPacket (void); +void PrintPacket (const unsigned char *p, int size, int type); + +/**************************************************************************** +*# +*# FUNCTION NAME: net_init +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 2002 05 02 ronny Initial version +*# +*#***************************************************************************/ +void +net_init(void) +{ + pcap_if_t* alldevs; + pcap_if_t* d; + char errbuf[PCAP_ERRBUF_SIZE]; + LPADAPTER pAdapter; + char pOidDataBuf[sizeof(PACKET_OID_DATA)-1+sizeof(eth_addr_local)]; + PPACKET_OID_DATA pOidData; + + if (strlen(device) == 0) { + /* Retrieve the device list */ + if (pcap_findalldevs(&alldevs, errbuf) == -1) { + fprintf(stderr,"Error finding devices: %s\n", errbuf); + exit(EXIT_FAILURE); + } + + if (alldevs == NULL) { + printf("\nNo network adapters found!\n"); + exit(EXIT_FAILURE); + } + + /* Use first device/interface */ + d = alldevs; + if (db1) printf("Using device %s (%s)\n", d->name, + (d->description ? d->description : + "No description available")); + strcpy(device, d->name); + pcap_freealldevs(alldevs); + } + + if ((pd = pcap_open_live(device, 200, promisc, -1, errbuf)) == NULL) { + printf("Error opening device %s\n", errbuf); + exit(EXIT_FAILURE); + } + + /* Determine Ethernet address */ + if ((pAdapter = PacketOpenAdapter(device)) == NULL) { + printf("Error opening packet adapter!\n"); + exit(EXIT_FAILURE); + } + + pOidData = &pOidDataBuf[0]; + pOidData->Oid = OID_802_3_CURRENT_ADDRESS; + pOidData->Length = sizeof(eth_addr_local); + if (!PacketRequest(pAdapter, FALSE, pOidData)) { + printf("Error obtaining adapter Ethernet address!\n"); + exit(EXIT_FAILURE); + } + + PacketCloseAdapter(pAdapter); + pAdapter = NULL; + + memcpy(eth_addr_local, pOidData->Data, sizeof(eth_addr_local)); + if (db1) printf("Ethernet adress for device is %2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x\n", + eth_addr_local[0], + eth_addr_local[1], + eth_addr_local[2], + eth_addr_local[3], + eth_addr_local[4], + eth_addr_local[5]); + + handler = (pcap_handler) Handler; +} + +/**************************************************************************** +*# +*# FUNCTION NAME: NetBoot +*# +*# DESCRIPTION: The main network boot routine. +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 2000 01 07 ronny Initial version +*# 2002 05 02 ronny Fixed segv bug +*# +*#***************************************************************************/ + +void +NetBoot(void) +{ + struct packet_buf *p; + struct timeval tv; + + gettimeofday(&tv, NULL); + + p = create_packet(0); + SendToDevice(p->data, p->size); + + while(1) { + static int all_trans = FALSE; + + if (got_new_packet) { + got_new_packet = FALSE; + + if (new_ack && first_packet) { + if (db4) { + printf("* got ACK %d.\n", last_ack_received); + printf("* ACK wanted %d.\n", first_packet->seq); + } + if (last_ack_received == first_packet->seq) { + if (!(p = create_packet(first_packet->seq+1))) { + //break; + } + first_packet = free_packet(first_packet); + } + } + } + + if (new_ack || timeout(&tv, 500)) { + if (p) { + SendToDevice(p->data, p->size); + } + new_ack = FALSE; + gettimeofday(&tv, NULL); + } + + GetNextPacket(); + } +} + +/**************************************************************************** +*# +*# FUNCTION NAME: GetNextPacket +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 961022 ronny Initial version +*# +*#***************************************************************************/ + +void +GetNextPacket(void) +{ + int ret; + + if (db2) printf("> GetNextPacket\n"); + + /* got_new_packet = FALSE;*/ + if ((ret = pcap_dispatch(pd, 1, handler, buf)) == -1) { + pcap_perror(pd, "Error in pcap_dispatch"); + exit(EXIT_FAILURE); + } + + if (db2) printf("< GetNextPacket\n"); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: Handler +*# +*# PARAMETERS: +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 961022 ronny Initial version +*# +*#***************************************************************************/ + +void +Handler(unsigned char *buf, const struct pcap_pkthdr *hdr, + const unsigned char *p) +{ + const unsigned char *src = &p[6]; + const unsigned char *dst = &p[0]; + struct packet_header_T *h = (struct packet_header_T*)p; + + if (db2) printf("> Handler\n"); + got_new_packet = TRUE; + if ((!memcmp(src, eth_addr_local, 6) && !memcmp(dst, dst_addr_of_device, 6)) + || (!memcmp(src, src_addr_of_device, 6) && !memcmp(dst, eth_addr_local, 6))) { + if (db1) printf("#RX######################################################\n"); + if (db1) printf("Length: %u(0x%x)\n", (udword)hdr->len, (udword)hdr->len); + if (pPacket) PrintPacket(p, hdr->caplen, printPacketType); + DecodeSvintoBoot(p); + /* should clean up this... */ + if ((ntohl(h->type) == ACK)) { + if (all_ids || (ntohl(h->id) == id)) { + if (all_ids && one_id_only) { + if (ntohl(h->id) == 0) { + all_ids = FALSE; + id = ntohl(h->id); + printf("Booting device with random id %8.8x.\n", id); + } + } + } + else { + printf("Got ACK from a new id, %8.8lx. Ignoring.\n", + (unsigned long)ntohl(h->id)); + return; + } + new_ack = TRUE; + last_ack_received = ntohl(h->seq); + if (last_ack_received > highest_ack_received) { + highest_ack_received = last_ack_received; + } + } + + if (db1) printf("#########################################################\n"); + + } + if (db2) printf("< Handler\n"); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: ack_on_seq +*# +*# PARAMETERS: +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 980817 ronny Initial version +*# +*#***************************************************************************/ + +struct packet_buf * +packet_with_seq(int seq) +{ + static int last_seq = 0; + struct packet_buf *p = first_packet; + struct packet_header_T *h; + + if (seq < last_seq) { + p = first_packet; + } + + while(p) { + h = (struct packet_header_T*)p->data; + if (ntohl(h->seq) == seq) { + return(p); + } + p = p->next; + } + return(NULL); +} + +struct packet_buf * +ack_on_seq(int seq) +{ + struct packet_buf *p = &first_rec_packet; + struct packet_header_T *h; + + if (db1) printf("***> ack_on_seq: %d.\n", seq); + + while (p) { + /* printf("\nPacket at %x.\n", p);*/ + /* DecodeSvintoBoot(p->data);*/ + h = (struct packet_header_T*)p->data; + if ( (ntohl(h->type) == ACK) && (ntohl(h->seq) == seq) ) { + if (all_ids || ntohl(h->id) == id) { + printf("***< ack_on_seq %d, ok.\n", seq); + return(p); + } + } + p = p->next; + } + if (db1) printf("***< ack_on_seq, no.\n"); + return(NULL); +} + +int +highest_seq_received(void) +{ + struct packet_buf *p = &first_rec_packet; + struct packet_header_T *h; + int highest_seq = -1; + + if (db1) printf("***> highest_seq_received\n"); + + while (p) { + /* printf("\nPacket at %x.\n", p);*/ + /* DecodeSvintoBoot(p->data);*/ + h = (struct packet_header_T*)p->data; + if ((ntohl(h->type) == ACK) && (all_ids || (ntohl(h->id) == id))) { + if ((int)ntohl(h->seq) > highest_seq) { + highest_seq = ntohl(h->seq); + if (db4) printf("Highest seq: %d\n", highest_seq); + } + } + p = p->next; + } + + if (db1) printf("***< highest_seq_received: %d\n", highest_seq); + return(highest_seq); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: PrintPacket +*# +*# PARAMETERS: +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 961022 ronny Initial version +*# +*#***************************************************************************/ + +void +PrintPacket(const unsigned char *p, int size, int type) +{ + int i; + + /* printf("size %d\n", size);*/ + for (i = 0; i != size; i++) { + if (i % p_packet_bpl == 0) + printf("\n%-4.4d: ", i); + if (type == UDEC) + printf("%-3d ", p[i]); + else if (type == HEX) + printf("%-2.2x ", p[i]); + else if (type == CHAR) { + if (isprint(p[i])) + printf("%-3c ", p[i]); + else + printf("%-3d ", p[i]); + } + else if (type == ASCII) { + if (isprint(p[i])) + printf("%c", p[i]); + else + printf("."); + } + } + printf("\n"); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: DecodeSvintoBoot +*# +*# PARAMETERS: +*# +*# DESCRIPTION: Decodes packets that follow the e100boot protocol. +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 961022 ronny Initial version +*# +*#***************************************************************************/ + +void +DecodeSvintoBoot(const unsigned char *p) +{ + char *str; + volatile struct packet_header_T *ph = (struct packet_header_T*)p; + + /* printf("size %d \n", sizeof(struct packet_header_T));*/ + + if (db4) printf("\n>DecodeSvintoBoot. Packet at 0x%x\n", (unsigned int)p); + if (db1) { + printf("%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x -> ", p[6],p[7],p[8],p[9],p[10], p[11]); + printf("%2.2x-%2.2x-%2.2x-%2.2x-%2.2x-%2.2x\n", p[0],p[1],p[2],p[3],p[4], p[5]); + + printf("length : %4.4lx\n", (long)ntohs(ph->length)); + printf("snap1 : %8.8lx\n", (long)ntohl(ph->snap1)); + printf("snap2 : %8.8lx\n", (long)ntohl(ph->snap2)); + + switch (ntohl(ph->tag)) { + case 0xffffffff: + str = "(host > ETRAX)"; + break; + case 0xfffffffe: + str = "(host < ETRAX)"; + break; + default: + str = "(unknown)"; + break; + } + printf("tag : %8.8lx %s\n", (unsigned long)ntohl(ph->tag), str); + printf("seq : %8.8lx\n", (unsigned long)ntohl(ph->seq)); + } + + switch (ntohl(ph->type)) { + + case STRING: + str = "(STRING)"; + fprintf(stderr, "%s", &p[sizeof(struct packet_header_T)]); + find_string((char*)&p[sizeof(struct packet_header_T)]); + break; + + case NET_INT: { + char search_str[20]; + + str = "(NET_INT)"; + sprintf(search_str, "0x%8.8lx", ntohl(*(udword*)&p[sizeof(struct packet_header_T)])); + fprintf(stderr, search_str); + find_string(search_str); + break; + } + + case NET_INT_NL: { + char search_str[20]; + + str = "(NET_INT_NL)"; + sprintf(search_str, "0x%8.8lx\n", ntohl(*(udword*)&p[sizeof(struct packet_header_T)])); + fprintf(stderr, search_str); + find_string(search_str); + break; + } + + case ACK: + str = "(ACK)"; + break; + + case BOOT_PACKET: + str = "(bootpacket)"; + break; + + case BOOT_CMDS: + str = "(bootcmds)"; + break; + + default: + str = "(unknown)"; + break; + } + + if (db1) { + printf("(type : %8.8lx %s)\n", (unsigned long)ntohl(ph->type), str); + printf("(id : %8.8lx)\n", (unsigned long)ntohl(ph->id)); + id = ntohl(ph->id); + } +} + +/**************************************************************************** +*# +*# FUNCTION NAME: SendToDevice +*# +*# PARAMETERS: +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 980818 ronny Initial version +*# +*#***************************************************************************/ + +void +SendToDevice(unsigned char *data, int data_len) +{ + char fName[MAX_STRING_LEN]; + FILE *fd; + struct packet_header_T *h = (struct packet_header_T*) data; + + if (db1) printf("***> SendToDevice\n"); + + if (db2) printf("Sending %d bytes at 0x%x to %s.\n", data_len, (unsigned int)data, device); + if (db1) printf("#TX######################################################\n"); + if (db1) DecodeSvintoBoot(data); + + if (db1) printf("#########################################################\n"); + if (toFiles || cmdsOnly) { + if (cmdsOnly) { /* use a simpler name */ + sprintf(fName, "e100boot.cmds"); + } + else { + sprintf(fName, "e100boot.seq%lu", (unsigned long)ntohl(h->seq)); + } + if (db2) printf("Writing packet to file '%s'.\n", fName); + if ((fd = fopen(fName, "w+")) == NULL) { + printf("Cannot open/create '%s'. %s.\n", fName, strerror(errno)); + exit(EXIT_FAILURE); + } + fwrite(data, data_len, 1, fd); + fclose(fd); + } + else if (pcap_sendpacket(pd, data, data_len) < 0) { + perror("pcap_sendpacket failed!\n"); + exit(EXIT_FAILURE); + } + + if (db1) printf("<*** SendToDevice\n"); +} + +/**************************************************************************** +*# +*# FUNCTION NAME: timeout +*# +*# PARAMETERS: +*# +*# DESCRIPTION: +*# +*#--------------------------------------------------------------------------- +*# HISTORY +*# +*# DATE NAME CHANGES +*# ---- ---- ------- +*# 980817 ronny Initial version +*# +*#***************************************************************************/ + +int +timeout(struct timeval *tvThen, int ms) +{ + struct timeval tvNow; + struct timeval tvDiff; + + (void) gettimeofday(&tvNow, NULL); + tvDiff = timeval_subtract(&tvNow, tvThen); + if (db4) printf("sec %d.%d\n", (int)tvDiff.tv_sec, (int)tvDiff.tv_usec); + if (ms * 1000 < (tvDiff.tv_sec * 1000000 + tvDiff.tv_usec)) { + if (db4) printf("TIMEOUT\n"); + return(TRUE); + } + + return(FALSE); +} + +/**************************************************************************** + *# + *# FUNCTION NAME: timeval_subtract + *# + *# PARAMETERS: + *# + *# DESCRIPTION: Subtract x-y, and return result. + *# + *# DATE NAME CHANGES + *# ---- ---- ------- + *# 970128 ronny Initial version + *# + *#***************************************************************************/ + +struct timeval +timeval_subtract(struct timeval *x, struct timeval *y) +{ + struct timeval diff; + + diff.tv_sec = x->tv_sec - y->tv_sec; + diff.tv_usec = x->tv_usec - y->tv_usec; + + if (diff.tv_usec < 0) { + diff.tv_sec--; + diff.tv_usec = 1000000 + diff.tv_usec; + } + + return diff; +} + +int +gettimeofday(struct timeval *tv, void* tz_void) +{ + struct _timeb tb; + _ftime(&tb); + tv->tv_sec = tb.time; + tv->tv_usec = tb.millitm * 1000; + return 0; +} -- cgit v1.2.3